C# WPF:组合框在绑定ItemSource集合更改后丢失所选索引
我在谷歌上搜索过答案,我的问题在某种程度上与下面的问题有关,但不同之处足以让我提出一个新问题 基本上,我有一个WPF组合框,它绑定到一个ObservableCollection类。这个类有额外的功能来延迟集合更改通知,如果我需要对它进行一些更改,例如清除和重新填充它以获得数据库的新快照 我的组合框绑定同时设置了DisplayMemberPath和SelectedValuePath。SelectedValuePath解析为整数属性 该问题与引用的问题相同,当我刷新绑定集合中的值时,绑定组合框将取消其选择,并变为空白(SelectedIndex=-1) 我可以确认CollectionChanged事件不会被触发,直到集合重新填充并将项目放回其中 更令人费解的是,如果我这样做:C# WPF:组合框在绑定ItemSource集合更改后丢失所选索引,c#,.net,wpf,data-binding,combobox,C#,.net,Wpf,Data Binding,Combobox,我在谷歌上搜索过答案,我的问题在某种程度上与下面的问题有关,但不同之处足以让我提出一个新问题 基本上,我有一个WPF组合框,它绑定到一个ObservableCollection类。这个类有额外的功能来延迟集合更改通知,如果我需要对它进行一些更改,例如清除和重新填充它以获得数据库的新快照 我的组合框绑定同时设置了DisplayMemberPath和SelectedValuePath。SelectedValuePath解析为整数属性 该问题与引用的问题相同,当我刷新绑定集合中的值时,绑定组合框将取
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。视图模型是一个注入自身的层。