3

我有一个使用 DataTemplate 链接到我的 ViewModel 的视图,如下所示

<DataTemplate DataType="{x:Type ViewModels:ViewModel}">
    <Views:View />
</DataTemplate>

ViewModel 拥有一个ProcessOption类型为的属性MyEnum?,其中MyEnum是一个自定义枚举,假设有 3 个值SingleMultipleAll。我正在尝试将组合框绑定到此属性,因此我遵循的方法是:

ViewModel 有一个属性List<string>

public List<string> Options
    {
        get 
        {
            return Enum.GetNames(typeof(MyEnum)).ToList();
        }
    }

ItemsSourceCombobox. 然后,除了ProcessOption属性之外,ViewModel 还有一个OptionName属性 (of string),用于保存所选选项的名称。ViewModel 实现INotifyPropertyChanged并且两个属性在其设置器中引发PropertyChanged事件。我当时使用的绑定是:

<ComboBox ItemsSource="{Binding Options}"
    SelectedItem="{Binding OptionName}"
    SelectedValue="{Binding ProcessOption}"/>

到目前为止,这工作正常。最初,组合框是空的,两个属性都是null,当用户选择一个选项时,它会按应有的方式传播到 ViewModel。

当我从数据库加载数据时出现问题,我想加载具有初始值的控件。在这种情况下,在 ViewModel 的构造函数中我有这个:

this.ProcessOption = objectFromDB.ProcessOption // this is the value restored from DB,        let's say it is MyEnum.Multiple
this.OptionName = Options.First(x => x.Equals(Enum.GetName(typeof(MyEnum), objectFromDB.ProcessOption)));

问题是,虽然上面将这两个属性设置为正确的值,但它们后来从Combobox绑定中设置为 null,因此不保留初始值。我还尝试if (value == null) { return; }在属性的设置器中执行类似操作,在这种情况下,它们在视图加载后具有正确的值,但是Combobox仍然没有显示正确的选项,它是空的。

我还应该注意,我也尝试过设置IsSynchronisedWithCurrentItem,除了显示第一个元素而不是组合框为空之外,它没有任何区别。

任何人都可以帮助这个绑定吗?任何帮助将不胜感激,这让我发疯!

4

1 回答 1

0
<ComboBox ItemsSource="{Binding Options}"
    SelectedItem="{Binding OptionName}"
    SelectedValue="{Binding ProcessOption}"/>

您的绑定看起来根本不应该工作-您没有设置双向绑定,我认为SelectedItemandSelectedValue是一个非此即彼的提议。

我建议您摆脱OptionName并绑定SelectedItemProcessOption(TwoWay) 并使用IValueConverter将转换为/从string.

于 2012-04-27T13:27:31.807 回答