2009-11-16 3 views
2

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

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

Буду Вам благодарен за помощь!

ответ

3

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

+0

Это способ сделать это! Посмотрите здесь: http://msdn.microsoft.com/en-us/library/ms753962.aspx – Dabblernl

+0

Исправьте меня, если я ошибаюсь, но правила валидации не относятся к значениям конкретного элемента списка, а не сам список? Другими словами, как я могу проверить правило проверки дубликатов в списке, содержащем элемент, когда элемент не знает, что он является частью списка? –

2

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

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

Edit:

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

+0

Я думаю, что это не сработает - поскольку текстовое поле привязано к элементу, вы вообще не меняете коллекцию. Вам нужно будет удалить/прочитать элемент для запуска CollectionChanged. –

+0

Да, но вы можете использовать реализацию коллекции Observable, которая уведомляет об изменении элементов. Я отредактировал свой ответ, чтобы отразить это. – luvieere

+0

Я посмотрел на решение Сорена, и это выглядит многообещающим. Однако мой недостаток опыта C# не позволяет мне расширить класс ObservableCollectionEx для работы для меня. Например, его обработчик событий ReactToChange не принимает никаких свойств, так как я могу узнать, какой элемент вызвал событие и какое свойство было изменено? –

Смежные вопросы