Есть два изсестных мне подхода проверки вводимых данных и выдачи соотвествующего сообщения пользователю - это генерация исключения в сеттере и использование 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. Получим что-то такое:
Теперь в зависимости от типа исключения рамка будет либо класной, либо желтой.
Комментариев нет:
Отправить комментарий