MVVM и ошибки преобразования в WPF — объединение исключений обратного преобразования из представления с ошибками проверки из модели?

#wpf #validation #mvvm #converter #data-conversion

#wpf #проверка #mvvm #конвертеры #преобразование данных

Вопрос:

Я разрабатываю приложение WPF с использованием шаблона MVVM, как описано Джошем Смитом в статье на http://msdn.microsoft.com/en-us/magazine/dd419663.aspx.

Я не могу придумать хороший способ реагирования на ошибки обратного преобразования (например, когда пользователь вводит букву в текстовое поле, привязанное к двойному).

Джош Смит предлагает систему проверки, в которой Модель проверяет свои собственные значения и представляет логический результат через SomeModel.isValid. Затем Джош использует значение isValid в качестве предиката для определенных кнопок, например кнопки Сохранения в форме — если форма не была заполнена надлежащим образом, значение isValid равно false и кнопка сохранения отключена.

Этот метод работает действительно хорошо. Однако, когда пользователь вводит значение в текстовое поле, которое не может быть преобразовано, возникает ошибка обратного преобразования. Параметр ViewModel для свойства никогда не вызывается, и, следовательно, свойство модели никогда не обновляется. Значение isValid остается истинным. Хотя представление реагирует на ошибку проверки, показывая сообщение об ошибке и выделяя ошибку (или какой бы ни была настройка), кнопка Сохранить остается активной, поскольку свойство isValid модели по-прежнему имеет значение true, поскольку модель не обновлялась.

Есть ли пользователи MVVM, которые сталкивались с такой же проблемой? Есть идеи?

Одно из предположений заключается в том, что свойство модели может быть обнуляемым. Затем преобразователю следует присвоить источнику значение Null, если пользователь вводит неконвертируемую дату (например, букву в текстовом поле, привязанную к двойному). Однако я не смог найти простой способ сделать это — похоже, требуется написание пользовательских преобразователей для каждого типа данных, для которого мне требуется функциональность, и для каждого числового формата, в котором мне это требуется. Это очень плохое решение того, что кажется проблемой дизайна.

Есть идеи?

Ответ №1:

Я нашел две отличные статьи, посвященные этой проблеме:

Автор Карл Шиффлетт: http://karlshifflett.wordpress.com/mvvm/input-validation-ui-exceptions-model-validation-errors

Автор: Джош Смит:

http://joshsmithonwpf.wordpress.com/2008/11/14/using-a-viewmodel-to-provide-meaningful-validation-error-messages/

Это слишком сложно дублировать здесь, поэтому я просто отмечу ссылки как ответ.

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

1. Первая ссылка теперь недоступна

Ответ №2:

Возможно, вас заинтересует образец приложения BookLibrary WPF Application Framework (WAF). Показано, как исключения синтаксического анализа или обратного преобразования обрабатываются как ошибки проверки.

Просто введите «abc» в текстовое поле «Страницы» и посмотрите, как ошибка проверки отображается в виде всплывающей подсказки, а кнопка Сохранить отключена.