Как я могу предотвратить дубликаты в элементе управления WPF Listbox? - PullRequest
2 голосов
/ 16 ноября 2009

У меня есть элемент управления WPF listbox, который декларативно связан с текстовым полем. ItemsSource списка - это ObservableCollection, созданный из файла XML. Я могу легко предотвратить дублирование записей в списке при добавлении нового элемента, потому что я могу проверить это в обработчике события Click кнопки «Добавить».

Однако, когда значение существующего элемента изменяется в текстовом поле (которое, очевидно, показывает выбранный элемент списка) на значение, которое уже существует в списке, я хочу предотвратить это, но не знаю, как.

Буду признателен за помощь!

Ответы [ 2 ]

3 голосов
/ 16 ноября 2009

Вы можете создать свое собственное правило проверки, исходя из ValidationRule и применить его к привязке вашего текстового поля. В методе Validate вы можете проверить наличие дубликатов и вернуть ValidationResult в значение false, чтобы предотвратить обновление источника привязки.

2 голосов
/ 16 ноября 2009

Прослушайте событие CollectionChanged и проверьте, была ли изменена коллекция, если есть какие-либо дубликаты, и удалите их.

Кроме того, вы можете взглянуть на этот вопрос и его ответ на наблюдаемую коллекцию, которая также уведомляет вас, когда изменяются свойства ее элементов.

Редактировать:

Если вы не хотите использовать коллекцию, о которой я говорил выше, вы можете убедиться, что элементы вашей коллекции реализуют INotifyPropertyChanged, и каждый раз, когда вы добавляете элемент в коллекцию, слушайте его событие PropertyChanged. В обработчике вы проверяете, является ли изменяемое свойство тем, которое отображается в ListBox, и проверяете, имеет ли какой-либо другой элемент такое же значение этого свойства. Если вы найдете такой элемент, вы либо измените значение вашего свойства на его старое значение, либо полностью удалите элемент, это зависит от логики вашего приложения.

...