我搜索了谷歌并在这里寻找答案,我的问题与下面的问题有些相关,但又不同以保证一个新的问题。
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好得多。
答案 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。