WPF:绑定的ItemSource集合发生更改后,组合框丢失选定的索引
我搜索了谷歌并在这里寻找答案,我的问题与下面的问题有一定的关系,但不同的地方足以提出一个新的问题。
收集更改后,组合框会丢失选择
基本上,我有一个绑定到ObservableCollection类的WPF组合框。 如果需要对数据库进行一系列更改(如清理并重新填充数据库以获取全新数据库快照),则此类具有延迟收集更改通知的额外功能。
我的组合框绑定同时具有DisplayMemberPath和SelectedValuePath集。 SelectedValuePath解析为整数属性。
问题与引用的问题相同,当我刷新绑定集合中的值时,绑定的组合框将失去其选择并变为空白(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值集,因此我认为它不会假设它会调整其项目匹配逻辑。 然而,这超出了预期的范围。
我意识到我可能会接受这只是WPF的工作原理,但在与WinForms中的数据绑定组合框战斗了几年之后,我有点希望我不必与WPF :) - 虽然说WPF Comboboxes远胜于WinForm。
这种说法是错误的
如果我不使用SelectedValuePath绑定,我可以接受,但是因为我
您没有绑定到SelectedValuePath。
您绑定到一组对象。
SelectedValuePath仅用于报告,与比较对象的等同性无关。 DisplayMemberPath仅用于报告,与比较对象的等式无关。
您将SelectValuePath与SelectedItem混淆。
ComboBox不使用SelectedValuePath来确定两个对象是否相等。
从SelectedValuePath的文档:
获取或设置用于从SelectedItem获取SelectedValue的路径。
在让您感到困惑的示例中,您将加载相同的对象。
我将假设SelectedValuePath是一个名为ID的属性
如果清除并重新创建ID为6的对象,则它不等于ID为6的已清除对象。
尝试这个。 创建ID为6的两个对象(o1和o2)并比较o1.Equals(o2)。
如果你想让两个ID为6的对象相等,那么你需要重写GetHashCode和Equals。 在Equals中,如果两者的ID均为6,则返回true。您可以使用ID作为GetHashCode。
字符串是会欺骗你的引用类型。
字符串s1 =“猫”;
字符串s2 =“猫”;
s1.Equals(s2)将返回true,因为String Equals被覆盖以比较值。
上一篇: WPF: Combobox losing selected index after bound ItemSource collection changes