7

我搜索了谷歌和这里的答案,我的问题与下面的问题有些相关,但不同之处足以保证一个新问题。

集合更改后组合框丢失选择

基本上,我有一个绑定到 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 的要好得多。

4

1 回答 1

4

这个说法是错误的

如果我不使用 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。如果两者的 ID 均为 6,则在 Equals 中返回 true。您可以使用 ID 作为 GetHashCode。

String 是一种会欺骗你的引用类型。
字符串 s1 = "猫";
字符串 s2 = "猫";
s1.Equals(s2) 将返回 true,因为 String Equals 被覆盖以比较值。

于 2013-08-14T19:31:12.163 回答