Это сумасшедший способ обработки нескольких типов валидации с IDataError и WPF? - PullRequest
5 голосов
/ 26 сентября 2008

Мы используем стандартный метод для наших элементов управления, чтобы сообщать о нарушенных правилах BO. Это делается через интерфейс IDataError в наших BO, а в XAML элемент управления привязан к свойству BO и т. Д. Этот подход работает нормально. Но нам нужно показать 2 типа визуалов в пользовательском интерфейсе в зависимости от типа (или категории, если хотите) ошибки аннулирования. Если это обязательное поле, мы показываем CueBanner (водяной знак), но для других типов мы меняем цвет границы элементов управления. В обоих сценариях мы устанавливаем тип инструмента сообщения об ошибке.

Проблема с IDataError заключается в том, что он не поддерживает метод / свойство для различения типов ошибок.

Единственный способ, которым я могу это сделать, - изучить текст ошибки, в тексте обязательного поля должно быть ключевое слово «обязательный». Следующий подход не выглядит правильным, но это единственный способ, которым я могу определить тип ошибки и затем соответствующим образом устранить ее. Все обязательные правила поля должны иметь в тексте ошибки «обязательное поле». Чтобы все это работало, я создал собственное свойство зависимости с именем ErrorMessage. В моем ResourceDictionary у меня есть Style.Trigger для Validation.HasError. Там я установил для своих свойств зависимости значение ErrorContent. Теперь, когда изменяется значение моих свойств зависимости, я могу проверить текст и установить шаблон Validation.SetErrorTemplate (myControl, newErrorTemplate) в соответствии с типом ошибки. Я должен подключить несколько событий к элементу управления, например потерянный и получить фокус, чтобы управлять удалением или добавлением шаблона cueBanner, но все это будет работать. Просто я не уверен, что это лучший способ сделать это.

PS. Когда я устанавливаю ErrorTemplate, я делаю это в коде, это создает и добавляет его. Есть ли способ указать Validation.SetErrorTemplate на статический ресурс, помня о том, что мне нужно переключаться как минимум между двумя типами?

Ваши мысли, пожалуйста ..

Ответы [ 2 ]

3 голосов
/ 26 сентября 2008

Можно ли получить интерфейс IDataError, который добавляет дополнительное свойство, которое является перечислением типа ошибки. Тогда вы можете попытаться связать его.

0 голосов
/ 07 ноября 2011

Если вы согласны с (непроверенным) подходом, который немного страдает от ясности, то вы можете сделать следующее: генерировать исключение вместо возврата строки с интерфейсом IDataErrorInfo. В вашем ErrorTemplate вы можете получить доступ к ValidationErrors (и свойству ValidationError.Exception).

Затем вы используете DataTrigger для исключения в сочетании с конвертером, который проверяет правильный тип исключения и возвращает true или false. Этого должно быть достаточно для выполнения работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...