Правила прив'язки та перевірки даних WPF Найкращі практики


101

У мене дуже простий додаток WPF, в якому я використовую прив'язку даних, щоб дозволити редагувати деякі власні об'єкти CLR. Тепер я хочу внести деяку перевірку вводу, коли користувач натискає кнопку "Зберегти". Однак усі прочитані книги WPF насправді не приділяють цьому питанню місця. Я бачу, що ви можете створювати власні ValidationRules, але мені цікаво, чи це буде зайвим для моїх потреб.

Отже, моє запитання таке: чи є десь хороша прикладна програма чи стаття, яка демонструє кращі практики перевірки введення користувачів у WPF?

Відповіді:


83

Я думаю, що новим кращим способом може бути використання IDataErrorInfo

Детальніше читайте тут


3
Я також знайшов рамку Cinch ( cinch.codeplex.com ), яка включає демонстрацію передового досвіду в WPF + MVVM та використовує IDataErrorInfo
Mark Heath

3
У .NET 4.5 ви можете використовувати INotifyErrorInfo, що дозволяє повертати об'єкти замість просто рядків.
Пітер

24

З документації " Шаблони та практики MS" :

Перевірка даних та повідомлення про помилки

Вашій моделі чи моделі перегляду часто буде потрібно проводити перевірку даних та сигналізувати про будь-які помилки перевірки даних, щоб користувач міг діяти, щоб їх виправити.

Silverlight та WPF забезпечують підтримку керування помилками перевірки даних, які виникають при зміні окремих властивостей, які пов'язані з елементами управління у вікні перегляду. Для одиничних властивостей, які пов'язані з даними управління, модель або модель перегляду може сигналізувати про помилку перевірки даних всередині налаштування властивості, відхиляючи вхідне неправильне значення та видаючи виняток. Якщо властивість ValidatesOnExceptions на прив'язці даних є істиною, двигун прив'язки даних у WPF та Silverlight буде обробляти виняток і показувати візуальну підказку користувачеві про наявність помилки перевірки даних.

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

Документація далі пояснює, як реалізувати IDataErrorInfo та INotifyDataErrorInfo.


3
Я хвилювався спочатку, коли побачив рекомендацію щодо виключення для кидання. рада бачити, що після цього слід уникати
викидів

22
Слід також зазначити, що деякі muppet у microsoft вирішили не включати INotifyDataErrorInfo у .net4, а лише у сріблястому світлі. його біль ..
aL3891

5
@ al3891- це буде відсортовано у .NET 4.5- msdn.microsoft.com/en-us/library/…
RichardOD

@ aL3891 Чи існує альтернатива для відсутнього INotifyDataErrorInfo?
AgentKnopf

10

я особисто використовую винятки для обробки валідації. для цього потрібні наступні кроки:

  1. у виразі зв’язування даних вам потрібно додати "ValidatesOnException = True"
  2. у вашому об’єкті даних, до якого ви зобов’язуєтеся, вам потрібно додати обробник DependencyPropertyChanged, де ви перевірите, чи відповідає нове значення вашим умовам - якщо ні - ви відновите до об'єкта старе значення (якщо вам потрібно) і викинете виняток.
  3. у вашому шаблоні управління, який ви використовуєте для відображення недійсного значення в елементі управління, ви можете отримати доступ до колекції помилок та відобразити повідомлення про виключення.

хитрість тут полягає в прив’язуванні лише до об'єктів, які походять від DependencyObject. проста реалізація INotifyPropertyChanged не працювала б - у базі є помилка, яка не дозволяє отримати доступ до колекції помилок.


3

Також перевірте цю статтю . Нібито Microsoft випустила їхню бібліотеку підприємств (v4.0) зі своїх моделей та практик, де вони висвітлюють тему перевірки, але Бог знає, чому вони не включили перевірку WPF, тому в блозі, на який я спрямовую вас, пояснюється автор зробив, щоб адаптувати його. Сподіваюся, це допомагає!


2

Можливо, вас зацікавить зразок програми BookLibrary із Рамкової програми WPF (WAF) . Він показує, як використовувати перевірку в WPF та як керувати кнопкою Зберегти, коли є помилки перевірки.


0

Якщо ваш бізнес-клас безпосередньо використовується вашим інтерфейсом, то краще використовувати IDataErrorInfo, оскільки це наближає логіку до власника.

Якщо ваш бізнес-клас - це стуб-клас, створений посиланням на сервіс WCF / XmlWeb, ви не можете / не повинні використовувати IDataErrorInfo, а також не кидати виняток для використання з ExceptionValidationRule. Натомість ви можете:

  • Використовуйте власну ValidationRule.
  • Визначте частковий клас у вашому проекті інтерфейсу WPF та реалізуйте IDataErrorInfo.

1
Я знаю, що це по-старому, але сподіваюся, що Алекс зможе відповісти. Це висновок, до якого я прийшов, але проблема полягає в тому, що вам потрібно написати деяку валідацію для (для прикладу) властивості "Age", яка не може бути більшою за 100 в ValidationRule, а потім повторити ту саму логіку в інтерфейсі IDataErrorInfo , що дублює логіку. Чи є щось подібне?
JFTxJ

Де ти дублюєш логіку? в якійсь валідації сервера? Я думаю, що за вашим коментарем ви підтверджуєте IDAtaErrorInfo в інтерфейсі користувача і дублюєте перевірку в бізнес-об'єкті, чи не так? Якщо так, то це правильно перевірити в обидві сторони. Бізнес-об’єкти не можуть довіряти користувальницьким інтерфейсам і повинні виконати власну перевірку (хоча це здається дублюванням)
Alex Pollan

Ні, дублювання логіки перевірки є в IDataErrorInfo та у користувальницькому правилі перевірки ... Оскільки користувацьке правило перевірки - єдиний спосіб перевірки даних, перш ніж воно фактично оновлюється до пов'язаного об'єкта, це перевірка (вік повинен бути нижчим то 100) потрібно визначити в IDataErrorInfo, щоб повернути повідомлення "за полем", але воно також має бути реалізовано у власному правилі перевірки. Має сенс?
JFTxJ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.