WPF:Combobox在绑定ItemSource集合更改后丢失选定的索引

Mar*_*lon 7 .net c# data-binding wpf combobox

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

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

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

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

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

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

更令人费解的是,如果我做以下事情:

        using (_collection.DelayNotifications())
        {
            var items = _collection.ToArray();
            _collection.Clear();
            _collection.AddRange(items);
        }
Run Code Online (Sandbox Code Playgroud)

该组合框并没有失去其选定的值.

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

我正在使用.NET 3.5 SP1

有人有任何想法吗?

编辑

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

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

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

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

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

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

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