Страницы

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

суббота, 27 октября 2018 г.

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

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


Ответ

В общем решение нашлось в ходе изучения структуры класса 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. Получим что-то такое:

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

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

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