it-swarm-ru.tech

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

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

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

100
Mark Heath

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

Читать дальше здесь

83
rudigrobler

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

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

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

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

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

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

23
Pat

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

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

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

10
Greg

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

3
murki

Возможно, вас заинтересует пример приложения BookLibrary WPF Application Framework (WAF) = . В нем показано, как использовать проверку в WPF и как управлять кнопкой "Сохранить" при наличии ошибок проверки.

2
jbe

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

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

  • Используйте пользовательский ValidationRule.
  • Определите частичный класс в своем проекте пользовательского интерфейса WPF и реализует IDataErrorInfo.
0
Alex Pollan