Проверка элементов коллекции в WPF - PullRequest
2 голосов
/ 28 мая 2010

Я хотел бы знать, как люди собираются проверять коллекции в WPF. Скажем, например, что у меня есть наблюдаемая коллекция ViewModels, которую я привязываю к элементам сетки, и пользователь может добавлять новые строки в сетку и должен заполнять их.

Прежде всего мне нужно проверить каждую строку, чтобы убедиться, что обязательные поля каждой ViewModel заполнены. Это удобно и просто для каждой строки.

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

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

У кого-нибудь есть опыт правильного способа сделать это?

1 Ответ

2 голосов
/ 10 января 2011

Хитрость заключается в том, чтобы разместить логику проверки вашей коллекции так, чтобы она вызывалась при изменении свойства ItemsSource ItemsControl. Если вы используете IDataErrorInfo в своей модели представления, тогда установите ValidatesOnDataErrors = True в привязке ItemsSource и, когда имя свойства связанной коллекции передается в индексатор ошибок интерфейса, запустите логику, чтобы определить, является ли свойство по-прежнему допустимым или нет , Если вы используете настраиваемые правила проверки, тогда размещение правил в привязке ItemsSource должно быть хорошо, до.

Затем, в вашей модели представления, вызывайте событие PropertyChanged для свойства ItemsSource-bound всякий раз, когда происходит событие, которое изменяет допустимое / недействительное состояние коллекции. Например, если коллекции требуется определенное количество элементов, прослушайте событие CollectionChanged. Всякий раз, когда коллекция изменяется, вызывайте событие PropertyChanged для свойства ItemsSource-bound. Это говорит WPF, что свойство изменилось, что приводит к его повторной проверке. Таким образом, логика проверки вашей коллекции будет запускаться всякий раз, когда коллекция изменяется, и, если коллекция недействительна, WPF отображает обработчик ошибок или, если коллекция становится действительной, WPF удаляет обработчик ошибок.

...