如何防止WPF Listbox控件中出现重复?

如何防止WPF Listbox控件中出现重复?,wpf,listbox,duplicates,Wpf,Listbox,Duplicates,我有一个WPF listbox控件,它以声明方式绑定到文本框。listbox的ItemsSource是从XML文件构建的ObservableCollection。添加新项目时,我可以轻松防止列表框中出现重复条目,因为我可以在Add按钮的Click事件处理程序中检查它 但是,当文本框中现有项的值发生变化时,列表框中的选定项会明显地显示为列表中已经存在的项,我想阻止这种情况发生,但我不知道如何防止 我非常感谢你的帮助 侦听CollectionChanged事件,并检查集合何时被修改,是否存在任何重复

我有一个WPF listbox控件,它以声明方式绑定到文本框。listbox的ItemsSource是从XML文件构建的ObservableCollection。添加新项目时,我可以轻松防止列表框中出现重复条目,因为我可以在Add按钮的Click事件处理程序中检查它

但是,当文本框中现有项的值发生变化时,列表框中的选定项会明显地显示为列表中已经存在的项,我想阻止这种情况发生,但我不知道如何防止

我非常感谢你的帮助

侦听CollectionChanged事件,并检查集合何时被修改,是否存在任何重复项并将其删除

此外,您还可以查看一个可观察集合的问题及其答案,该集合在其“项”属性更改时也会通知您

编辑:


如果不想使用我上面提到的集合,可以确保集合的项实现INotifyPropertyChanged,并且每次向集合添加项时,都会侦听其PropertyChanged事件。在处理程序中,检查更改的属性是否为列表框中显示的属性,并检查是否有任何其他元素具有与此属性相同的值。如果找到这样的元素,您可以将属性的值更改为其旧值,也可以完全删除该元素,具体取决于应用程序的逻辑。

您可以通过派生ValidationRule来创建自己的验证规则,并将其应用于文本框的绑定。在Validate方法中,您可以检查重复项并返回ValidationResult false,以防止绑定源被更新。

我认为这不起作用-因为文本框绑定到一个项,所以您根本不会更改集合。要触发CollectionChanged,您必须删除/读取该项。是的,但是您可以使用一个可观察的集合实现,它会通知元素的修改。我编辑了我的答案来反映这一点。我看过索伦的解决方案,它看起来很有希望。然而,由于我缺乏C语言的经验,我无法扩展他的ObservaleCollectionEx类来为我工作。例如,他的ReactToChange事件处理程序不接受任何属性,那么我如何知道哪个项触发了事件以及哪个属性发生了更改?我如何侦听PropertyChanged事件?这不是Soren的ObservableCollectionEx所做的吗?是的,但正如您所提到的,它并没有告诉您哪个属性发生了更改。这是一种方法!看看这里:如果我错了,请纠正我,但是验证规则本身是否与特定列表项的值无关,而与列表本身无关?换句话说,当项目不知道它是列表的一部分时,如何在包含该项目的列表中签入重复项的验证规则?