双向绑定组合框到枚举
本文关键字:枚举 组合 绑定 | 更新日期: 2023-09-27 18:32:30
>我有一个视图,它使用DataTemplate链接到我的ViewModel,像这样
<DataTemplate DataType="{x:Type ViewModels:ViewModel}">
<Views:View />
</DataTemplate>
ViewModel 包含一个类型为 MyEnum?
的属性ProcessOption
,其中 MyEnum
是一个自定义枚举,假设有 3 个值:Single
、Multiple
和 All
。我正在尝试将组合框绑定到此属性,因此我遵循的方法是:
视图模型具有List<string>
属性,即
public List<string> Options
{
get
{
return Enum.GetNames(typeof(MyEnum)).ToList();
}
}
我将Combobox
的ItemsSource
属性绑定到其中。然后,除了 ProcessOption
属性之外,ViewModel 还有一个 OptionName
属性 (string
(,该属性用于保存所选选项的名称。ViewModel 实现INotifyPropertyChanged
并且两个属性都在其资源库中引发PropertyChanged
事件。然后我使用的绑定是:
<ComboBox ItemsSource="{Binding Options}"
SelectedItem="{Binding OptionName}"
SelectedValue="{Binding ProcessOption}"/>
到目前为止,这工作正常。最初,组合框为空,两个属性都null
,当用户选择一个选项时,这将按预期传播到 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,因此不会保留初始值。我还尝试在属性的 setter 中执行类似 if (value == null) { return; }
的操作,在这种情况下,它们在 View 加载后具有正确的值,但是Combobox
仍然没有显示正确的选项,它是空的。
我还应该注意,我也尝试过设置IsSynchronisedWithCurrentItem
,除了显示第一个元素而不是组合框为空之外,它没有任何区别。
任何人都可以帮助进行此绑定吗?任何帮助将不胜感激,这让我发疯!
<ComboBox ItemsSource="{Binding Options}"
SelectedItem="{Binding OptionName}"
SelectedValue="{Binding ProcessOption}"/>
您的绑定看起来根本不应该起作用 - 您没有设置TwoWay绑定,我认为SelectedItem
和SelectedValue
是一个非此即彼的命题。
我建议您摆脱OptionName
,只需将SelectedItem
绑定到ProcessOption
(TwoWay(,并使用一个可以转换为/从string
转换的IValueConverter
。