我搜索了谷歌和这里的答案,我的问题与下面的问题有些相关,但不同之处足以保证一个新问题。
基本上,我有一个绑定到 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 Combobox 必须“知道”它设置了 SelectedValuePath 值,因此我认为假设它会调整其项目匹配逻辑并不过分。然而,这超出了 SO 的范围。
我意识到我可能会接受这就是 WPF 的工作原理,但是在与 WinForms 中的数据绑定组合框斗争了几年之后,我有点希望我不必使用 WPF :) - 虽然说 WPF组合框比 WinForm 的要好得多。