Страницы

Поиск по вопросам

понедельник, 16 декабря 2019 г.

WPF проверка значений

#wpf #валидация


Есть два изсестных мне подхода проверки вводимых данных и выдачи соотвествующего
сообщения пользователю - это генерация исключения в сеттере и использование ExceptionValidationRule
и использование интерфейса IDataError.
Вопрос в следующем: можно ли применять разные стили ErrorTemplate в зависимости от
типа исключения?
Приведу пример - есть класс описывающий объект, с полями A, B и C. В зависимости
от занчений A и B поле C может быть либо обязательным, либо желательным. В первом случае
незаполненость поля C - это критическая ошибка и нельзя давать пользователю сохранить
объект, во втором же случае нужно просто уведомить пользователя.
На деле же я хочу применять разные стили в зависимости от того желательное поле или
обязательное для заполнения. Скажем для обязательных подсвечивать контролы красным,
а для желательных - зеленым. Возможно ли это, или придется придумать другой подход,
без использованяи встроенной валидации?    


Ответы

Ответ 1



В общем решение нашлось в ходе изучения структуры класса Validation. Почему я его так долго искал - не знаю, не туда смотрел видимо. У класса Validation есть коллекция Errors, которая содержит описание ошибок валидации. Дак вот каждый элемент этой коллекции имеет тип ValidationError, у которого и есть нужное нам свойство Exception. Теперь мы можем основываясь на его типе, определять шаблон. Приведу пример. Может кому пригодится. Есть простой класс: public class SomeClass { public int A { get; set; } public int B { get; set; } private int _c; public int C { get { return _c; } set { // Вот тут мы и будем в зависимости от состояния других полей генерировать разные исключения if (A == 0 && B == 0 && value == 0) throw new ArgumentMandatoryException("Поле является обязательным к заполнению"); if ((A != 0 || B != 0) && value == 0) throw new ArgumentDesiredException("Поле является желательным к заполнению"); _c = value; } } } Как видите в сеттере свойства C мы в зависимости от выполнения условия бросили два разных исключения. Теперь нам надо обработать это в шаблоне Validation.ErrorTemplate. Здесь нам помогут ContentControl и DataTemplate. Получим что-то такое: Теперь в зависимости от типа исключения рамка будет либо класной, либо желтой.

Комментариев нет:

Отправить комментарий