WPF:Combobox在绑定ItemSsource集合更改后丢失selectedindex

时间:2013-08-14 15:36:02

标签: c# .net wpf data-binding combobox

我搜索了谷歌并在这里寻找答案,我的问题与下面的问题有些相关,但又不同以保证一个新的问题。

Combo-box loses selection after collection changes

基本上,我有一个绑定到ObservableCollection类的WPF组合框。如果我需要对其进行一些更改,此类具有延迟收集更改通知的额外功能,例如清除并重新填充它以获取数据库的新快照。

我的组合框绑定同时设置了DisplayMemberPath和SelectedValuePath。 SelectedValuePath解析为整数属性。

问题与引用的问题相同,当我刷新绑定集合中的值时,绑定的ComboBox会丢失其选择,并变为空白(SelectedIndex = -1)。

我可以确认,在重新填充集合并将项目放回其中之前,不会触发CollectionChanged事件。

如果我做以下事情会更令人费解:

        using (_collection.DelayNotifications())
        {
            var items = _collection.ToArray();
            _collection.Clear();
            _collection.AddRange(items);
        }

组合框会丢失其选定值。

这表明如果集合中的项目被替换为从数据库中检索到的新项目,它会中断 - 如果我没有使用SelectedValuePath绑定,我可以接受这个,但是因为我是,并且因为整数值是同样,我当然应该做些什么呢?

我正在使用.NET 3.5 SP1

有人有任何想法吗?

修改

从下面的评论和Blam的回答中。我确实接受这些是为什么这样做的原因。但它并没有真正帮助我。

我将Combobox的SelectedValue属性绑定到视图模型上的Integer属性。如果我要绑定SelectedItem,我需要在我的视图模型上绑定到该对象类型的属性 - 但它是我实际执行的整数属性。

目前我通过强制属性'SelectedValue'的属性更改事件来“修复”(读取次要黑客)问题。这似乎使Combobox重新检查其内部列表,找到与定义的SelectedValuePath匹配的项目。

WPF组合框必须“知道”它具有SelectedValuePath值设置,因此我认为它没有太大的飞跃,可以假设它会调整其项目匹配逻辑。然而,这超出了SO的范围。

我意识到我可能会接受这就是WPF的工作原理,但是在WinForms中使用数据绑定的组合框架打了几年之后,我有点希望我不必使用WPF :) - 虽然说WPF Comboboxes比WinForm好得多。

1 个答案:

答案 0 :(得分:4)

这句话错了

  

如果我没有使用SelectedValuePath绑定,我可以接受这个,   但因为我

绑定到SelectedValuePath 您绑定到一组对象 SelectedValuePath仅用于报告与比较对象的相等性无关。 DisplayMemberPath仅用于报告与比较对象的相等性无关。

您将SelectValuePath与SelectedItem混淆 ComboBox不使用SelectedValuePath来确定两个对象是否相等。

来自SelectedValuePath的文档:

  

获取或设置用于从中获取SelectedValue的路径   的SelectedItem。

在让您感到困惑的示例中,您正在重新加载相同的对象。

我将假设SelectedValuePath是一个名为ID

的属性

如果清除并重新创建ID为6的对象,则它不等于ID为6的已清除对象。

试试这个。创建ID为6的两个对象(o1和o2)并比较o1.Equals(o2)。

如果您希望ID为6的两个对象相等,则需要覆盖GetHashCode和Equals。如果两者的ID均为6,则Equals返回true。您可以使用ID作为GetHashCode。

String是一种会欺骗你的引用类型 string s1 =“cat”;
string s2 =“cat”;
当字符串等于被重写以比较值时,s1.Equals(s2)将返回true。