绑定到枚举

时间:2015-12-18 10:04:45

标签: wpf mvvm combobox enums

我有一个WPF ComboBox绑定到包含枚举的类列表。

这一切都很好,我的问题是在这篇文章的最后,首先是代码:

这是班级:

public class FILTER_TEST
{
    public FilterType Filter { get; private set; }
    public string Description { get; private set; }

    public static List<FILTER_TEST> CreateFilters()
    {
        var list = new List<FILTER_TEST>();

        list.Add(new FILTER_TEST() { Filter = FilterType.CheckNone, Description = "Uncheck all" });
        list.Add(new FILTER_TEST() { Filter = FilterType.CheckAll, Description = "Check all" });
        list.Add(new FILTER_TEST() { Filter = FilterType.CheckCustom, Description = "Custom check" });

        return list;
    }
}

这是枚举FilterType:

public enum FilterType
{
    CheckNone,
    CheckAll,
    CheckCustom
}

在我的视图模型中,我有以下内容:

public List<FILTER_TEST> FilterNames { get { return FILTER_TEST.CreateFilters(); } }

public FILTER_TEST SelectedFilter
{
    get { return selectedFilter; }
    set
    {
        if (value != selectedFilter)
        {
            selectedFilter = value;
            OnPropertyChanged("SelectedFilter");
        }
    }
}

同样在视图模型中,我按如下方式设置ComboBox的SelectedItem:

SelectedFilter = FilterNames.Where(x => x.Filter == FilterType.CheckNone).FirstOrDefault();

以下是将所有内容放在一起的xaml:

<ComboBox DisplayMemberPath="Description" ItemsSource="{Binding FilterNames}"
SelectedItem="{Binding SelectedFilter, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsSynchronizedWithCurrentItem="True"/>

我的问题是虽然SelectionItem的更改有效,但ComboBox中显示的实际值不会改变

初始SelectedItem是“Uncheck all”,因为当加载窗口时,没有检查到任何相应的CheckBox控件(绑定到包含Boolean属性的另一个类)。我想要的是,当检查CheckBox时,SelectedItem会变为“自定义检查”。

这确实改变了SelectedItem的值:

SelectedFilter = FilterNames.Where(x => x.Filter == FilterType.CheckCustom).FirstOrDefault();

但ComboBox中显示的文字仍然是“取消全部检查”。

有没有人知道我错过了什么?我被迫使用4.0框架,我不知道这是否相关。

1 个答案:

答案 0 :(得分:1)

我已经看到提示覆盖正在使用的Equals()类型:

public override bool Equals(object o)
{
      if (o is FILTER_TEST)
      {
           var other = o as FILTER_TEST;
           return this.Description == other.Description && this.Filter == other.Filter;
      }
      else
           return false;
}

现在,这使您的样本工作。让我回来参考 why