【问题标题】:WPF ComboBox SelectedItem when bound to an enum绑定到枚举时的 WPF ComboBox SelectedItem
【发布时间】:2016-03-25 00:08:34
【问题描述】:

我有一个 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 控件(绑定到另一个包含布尔属性的类)被选中。我想要的是,当 CheckBox 被选中时,SelectedItem 更改为“自定义检查”。

这确实改变了 SelectedItem 的值:

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

但是 ComboBox 中显示的文本仍然是“Uncheck all”。

有人知道我缺少什么吗?强制使用4.0框架,不知道有没有关系。

【问题讨论】:

    标签: wpf mvvm combobox enums


    【解决方案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;
    }
    

    现在您的示例可以正常工作了。让我回来参考一下为什么

    【讨论】:

    • 谢谢!在你的帮助下,我从 Rachel Lim 那里找到了这个:Rachels link你的小费和 Rachels 网站让这个工作,非常感谢,考虑这个接受!
    • 很高兴为您提供帮助,我确实了解问题所在,但不了解原因。为什么SelectedItem 不是同一个引用?它是相同的底层List&lt;FILTER_TEST&gt;,不是吗?
    • 老实说,我还认为 SelectedItem 使用了相同的引用。我从@Sheridan 看到另一篇关于如何从同一来源设置项目的帖子,这就是为什么我认为我的问题是另一个问题。
    • 实际上,每次调用return FILTER_TEST.CreateFilters(); 都会创建一个新列表,因此我们可以参考。
    猜你喜欢
    • 2011-07-03
    • 1970-01-01
    • 2010-10-24
    • 2011-11-01
    • 1970-01-01
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    相关资源
    最近更新 更多