Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF:组合框在绑定ItemSource集合更改后丢失所选索引_C#_.net_Wpf_Data Binding_Combobox - Fatal编程技术网

C# WPF:组合框在绑定ItemSource集合更改后丢失所选索引

C# WPF:组合框在绑定ItemSource集合更改后丢失所选索引,c#,.net,wpf,data-binding,combobox,C#,.net,Wpf,Data Binding,Combobox,我在谷歌上搜索过答案,我的问题在某种程度上与下面的问题有关,但不同之处足以让我提出一个新问题 基本上,我有一个WPF组合框,它绑定到一个ObservableCollection类。这个类有额外的功能来延迟集合更改通知,如果我需要对它进行一些更改,例如清除和重新填充它以获得数据库的新快照 我的组合框绑定同时设置了DisplayMemberPath和SelectedValuePath。SelectedValuePath解析为整数属性 该问题与引用的问题相同,当我刷新绑定集合中的值时,绑定组合框将取

我在谷歌上搜索过答案,我的问题在某种程度上与下面的问题有关,但不同之处足以让我提出一个新问题

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

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

该问题与引用的问题相同,当我刷新绑定集合中的值时,绑定组合框将取消其选择,并变为空白(SelectedIndex=-1)

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

更令人费解的是,如果我这样做:

        using (_collection.DelayNotifications())
        {
            var items = _collection.ToArray();
            _collection.Clear();
            _collection.AddRange(items);
        }
组合框不会丢失其选定值

这意味着,如果集合中的项被从数据库检索到的新项替换,它将中断-如果我没有使用SelectedValuePath绑定,我可以接受这一点,但因为我是,而且由于整数值相同,我所做的肯定会起作用

我正在使用.NET3.5SP1

有人有什么想法吗

编辑

从下面的评论和布拉姆的回答中。我承认这就是它这样做的原因。但这对我没什么帮助

我正在将组合框的SelectedValue属性绑定到视图模型上的整数属性。如果要绑定SelectedItem,我需要绑定到视图模型上该对象类型的属性——但实际上我要的是integer属性

目前,我已经通过强制属性'SelectedValue'的属性更改事件来“修复”(阅读minor hack)这个问题。这似乎使组合框重新检查其内部列表中与定义的SelectedValuePath匹配的项

WPF组合框必须“知道”它有一个SelectedValuePath值集,因此我认为假设它会调整其项匹配逻辑不会有太大的飞跃。然而,这超出了范围,因此是为了


我意识到我可能会接受这正是WPF的工作方式,但在与WinForms中的数据绑定组合框进行了几年的斗争之后,我有点希望我不必使用WPF:)-尽管说WPF组合框比WinForm组合框好得多。

这句话是错误的

如果我没有使用SelectedValuePath绑定,我可以接受这一点, 但因为我是

您未绑定到SelectedValuePath。
您正在绑定到一组对象。
SelectedValuePath仅用于报告,与比较对象是否相等无关。 DisplayMemberPath仅用于报告,与比较对象是否相等无关

您将SelectValuePath与SelectedItem混淆。
ComboBox不使用SelectedValuePath来确定两个对象是否相等

从SelectedValuePath的文档中:

获取或设置用于从中获取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=“cat”
字符串s2=“cat”

s1.Equals(s2)将返回true,因为字符串Equals被重写以比较值

ValuePath是不是另一个对象并不重要。。。您不能期望绑定保持不变,因为它绑定到特定对象。删除这些后,绑定将丢失…DelayNotificatons()返回的对象的处置方法将引发带有ListReset标志的CollectionChange事件。我仍然认为组合框会在它的新列表中查找它可以匹配的整数值。。。如果不是这样,我的选项是什么?在您的代码示例中,您使用相同的实例,因为您操作的唯一对象是集合。它不会显示,因为整数是不同的实例,即使它具有相同的值。。。希望它能让你的感官lol…绑定到SelectdItem。重写gethashcode和equals,使新SelectedItem与旧SelectedItem相同。或者自己比较并设置它……是的,我理解,但我没有绑定到SelectedItem,我绑定到SelectedValue。因此,我不希望ComboBox在SelectedItem上比较相等。虽然我猜它不能真正确定某人绑定了哪些属性,也不能调整其内部逻辑以适应套件。正如我的回答和Stefen的评论所述,不,您没有绑定到SelectedValue。您正在绑定到一组对象。DisplayMemberPath和SelectedValuePath仅用于报告。这就是答案。为什么你拒绝它而不是应用它?我不是拒绝它-我只是解释我在做什么。我不认为我的逻辑是毫无根据的。请参阅我对问题的编辑。我会给它几天时间,但我可能会接受你的答案。但是本机ComboBox绑定到一个对象集合并使用object equals。视图模型是一个注入自身的层。