双向绑定组合框到枚举

本文关键字:枚举 组合 绑定 | 更新日期: 2023-09-27 18:32:30

>我有一个视图,它使用DataTemplate链接到我的ViewModel,像这样

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

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

视图模型具有List<string>属性,即

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

我将ComboboxItemsSource属性绑定到其中。然后,除了 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绑定,我认为SelectedItemSelectedValue是一个非此即彼的命题。

我建议您摆脱OptionName,只需将SelectedItem绑定到ProcessOption(TwoWay(,并使用一个可以转换为/从string转换的IValueConverter