我有一个使用DataTemplate链接到我的ViewModel的View,就像这个
一样<DataTemplate DataType="{x:Type ViewModels:ViewModel}">
<Views:View />
</DataTemplate>
ViewModel包含ProcessOption
类型的属性MyEnum?
,其中MyEnum
是一个自定义枚举,可以说3个值:Single
,{{1} }和Multiple
。我正在尝试将组合框绑定到此属性,因此我遵循的方法是:
ViewModel的属性为All
List<string>
我绑定了public List<string> Options
{
get
{
return Enum.GetNames(typeof(MyEnum)).ToList();
}
}
的{{1}}属性。然后,除ItemsSource
属性外,ViewModel还具有Combobox
属性(ProcessOption
),用于保存所选选项的名称。 ViewModel实现OptionName
,两个属性都会在其setter中引发string
事件。我正在使用的绑定是:
INotifyPropertyChanged
到目前为止,此工作正常。最初组合框是空的,两个属性都是PropertyChanged
,当用户选择一个选项时,它会按原样传播到ViewModel。
当我从数据库加载数据时出现问题,我想用初始值加载控件。在这种情况下,在ViewModel的构造函数中我有:
<ComboBox ItemsSource="{Binding Options}"
SelectedItem="{Binding OptionName}"
SelectedValue="{Binding ProcessOption}"/>
问题是,尽管上面将两个属性设置为正确的值,但它们稍后会从null
绑定设置为null,因此不保留初始值。我还尝试在属性的setter中执行类似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)));
的操作,在这种情况下,它们在View加载后具有正确的值,但是Combobox
仍然没有显示正确的选项,它是空的
我还应该注意到,我还尝试设置if (value == null) { return; }
并且它没有任何区别,除了显示第一个元素而不是组合框是空的这一事实。
任何人都可以帮助这个绑定吗?任何帮助将非常感激,这让我发疯!
答案 0 :(得分:0)
<ComboBox ItemsSource="{Binding Options}"
SelectedItem="{Binding OptionName}"
SelectedValue="{Binding ProcessOption}"/>
你的绑定看起来根本不适用 - 你没有设置TwoWay绑定,我认为SelectedItem
和SelectedValue
是一个/或命题。
我建议您摆脱OptionName
并将SelectedItem
绑定到ProcessOption
(TwoWay)并IValueConverter
转换为string