Рекомендации по использованию правил привязки и проверки данных WPF

У меня очень простое приложение WPF, в котором я использую привязку данных, чтобы разрешить редактирование некоторых настраиваемых объектов CLR. Теперь я хочу добавить некоторую проверку ввода, когда пользователь нажимает кнопку «Сохранить». Однако все книги WPF, которые я прочитал, на самом деле не посвящают этому вопросу места. Я вижу, что вы можете создавать собственные ValidationRules, но мне интересно, будет ли это излишним для моих нужд.

Итак, мой вопрос заключается в следующем: есть ли где-нибудь хороший образец приложения или статьи, демонстрирующие передовой опыт проверки пользовательского ввода в WPF?


person Community    schedule 15.09.2008    source источник


Ответы (6)


Я думаю, что новый предпочтительный способ может заключаться в использовании IDataErrorInfo

Подробнее см. здесь

person Community    schedule 15.09.2008
comment
Я также нашел фреймворк Cinch (cinch.codeplex.com), который включает демонстрацию передовых методов проверка в WPF + MVVM и использует IDataErrorInfo - person Mark Heath; 04.09.2009
comment
В .NET 4.5 вы можете использовать INotifyErrorInfo, который позволяет вам возвращать объекты, а не просто строки. - person Peter; 19.12.2013

Из документации по шаблонам и методам MS:

Проверка данных и отчеты об ошибках

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

Silverlight и WPF обеспечивают поддержку управления ошибками проверки данных, возникающими при изменении отдельных свойств, привязанных к элементам управления в представлении. Для отдельных свойств, привязанных к элементу управления, модель представления или модель может сигнализировать об ошибке проверки данных в установщике свойств, отклоняя входящее недопустимое значение и создавая исключение. Если свойство ValidatesOnExceptions привязки данных имеет значение true, механизм привязки данных в WPF и Silverlight обработает исключение и отобразит визуальный сигнал для пользователя об ошибке проверки данных.

Однако по возможности следует избегать создания исключений со свойствами таким образом. Альтернативный подход - реализовать интерфейсы IDataErrorInfo или INotifyDataErrorInfo в вашей модели представления или классах моделей. Эти интерфейсы позволяют вашей модели представления или модели выполнять проверку данных для одного или нескольких значений свойств и возвращать сообщение об ошибке в представление, чтобы пользователь мог быть уведомлен об ошибке.

В документации объясняется, как реализовать IDataErrorInfo и INotifyDataErrorInfo.

person Community    schedule 01.12.2010
comment
Сначала я забеспокоился, когда увидел выдачу рекомендации об исключении. рад видеть, что следует избегать выброса исключений со свойствами таким образом, где это возможно - person kenwarner; 01.12.2010
comment
Следует также отметить, что некоторые маппеты в Microsoft решили не включать INotifyDataErrorInfo в .net4, а только в silverlight. это боль .. - person aL3891; 09.05.2011
comment
@ al3891 - это будет отсортировано в .NET 4.5- msdn.microsoft.com/en-us/library/ - person RichardOD; 05.05.2012
comment
@ aL3891 Есть ли альтернатива отсутствующему INotifyDataErrorInfo? - person AgentKnopf; 22.05.2013

лично я использую исключения для обработки проверки. это требует следующих шагов:

  1. в выражении привязки данных необходимо добавить ValidatesOnException = True
  2. в вашем объекте данных, к которому вы привязываетесь, вам нужно добавить обработчик DependencyPropertyChanged, где вы проверяете, соответствует ли новое значение вашим условиям - если нет - вы восстанавливаете старое значение объекта (если вам нужно) и генерируете исключение.
  3. в шаблоне элемента управления, который вы используете для отображения недопустимого значения в элементе управления, вы можете получить доступ к сбору ошибок и отобразить сообщение об исключении.

уловка здесь заключается в том, чтобы привязать только к объектам, которые являются производными от DependencyObject. простая реализация INotifyPropertyChanged не сработает - в фреймворке есть ошибка, которая не позволяет вам получить доступ к коллекции ошибок.

person Community    schedule 16.09.2008

Также проверьте эту статью. Предположительно Microsoft выпустила свой Enterprise Library (v4.0) из их шаблонов и практик, где они охватывают тему проверки, но бог знает, почему они не включили проверку для WPF, так что сообщение в блоге, которое я направляю вам к, объясняет, что сделал автор для его адаптации. Надеюсь это поможет!

person Community    schedule 15.09.2008


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

Если ваш бизнес-класс является классом-заглушкой, созданным ссылкой на службу WCF / XmlWeb, вы не можете / не должны использовать IDataErrorInfo или генерировать исключение для использования с ExceptionValidationRule. Вместо этого вы можете:

  • Используйте настраиваемое ValidationRule.
  • Определите частичный класс в своем проекте пользовательского интерфейса WPF и реализуйте IDataErrorInfo.
person Community    schedule 25.07.2012
comment
Я знаю, что это устарело, но надеюсь, Алекс сможет ответить. К этому же выводу я пришел, но проблема в том, что вам нужно написать некоторую проверку для (например) свойства Age, которое не может быть больше 100 в ValidationRule, а затем повторить ту же логику в интерфейсе IDataErrorInfo, который дублирует логику. Есть ли способ обойти это? - person JFTxJ; 20.09.2013
comment
Где продублируете логику? в какой-то валидации сервера? По вашему комментарию я предполагаю, что вы проверяете с помощью IDataErrorInfo в пользовательском интерфейсе и дублируете проверку в бизнес-объекте, не так ли? Если это так, то правильность проверки будет правильной с обеих сторон. Бизнес-объекты не могут доверять пользовательскому интерфейсу и должны выполнять собственную проверку (хотя это кажется дублированием). - person Alex Pollan; 04.10.2013
comment
Нет, дублирование логики проверки находится в IDataErrorInfo и в настраиваемом правиле проверки ... Поскольку настраиваемое правило проверки - единственный способ проверить данные ДО того, как они будут фактически обновлены для привязанного объекта, эта проверка (возраст должен быть ниже затем 100) необходимо определить в IDataErrorInfo для возврата сообщения для каждого поля, но также необходимо реализовать в настраиваемом правиле проверки. Имеет смысл? - person JFTxJ; 07.10.2013