Нужен совет относительно проверки в MVVM - PullRequest
1 голос
/ 24 ноября 2010

Я ценю, что это может звучать немного похоже на некоторые другие вопросы, но я не нашел такой, который бы полностью отвечал моему запросу, поэтому, пожалуйста, оставьте меня в покое. В настоящее время я конвертирую одно из моих существующих приложений в шаблон MVVM, чтобы улучшить его структуру, и я немного обеспокоен тем, что будет лучшим способом проверки данных.

В настоящее время приложение использует привязку данных для связи пользовательского интерфейса и кода и использует несколько правил проверки и преобразователей значений, которые можно повторно использовать для сходных значений (по одному для дат и т. Д.).

При чтении MVVM я наткнулся на IDataErrorInfo, который мне кажется привлекательным, поскольку он не позволяет проверять видимость, тем самым немного сокращая повторяющийся код при настройке привязок и т. Д. И допускает более конкретные сообщения об ошибках.

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

Моя главная проблема заключается в том, что если я слишком ограничиваю вещи в модели представления, чтобы это усложняло представление, - это хорошая идея ограничить вещи до комфортного уровня в общем случае, а затем исправить конкретные случаи, которые требуют больше гибкости в представлении?

Итак, мой главный вопрос: лучше ли поставить валидацию и преобразование в свойствах модели представления или придерживаться моих валидационных правил и преобразователей значений (или какого-то компромисса между ними)?

Спасибо, Джеймс

Ответы [ 2 ]

2 голосов
/ 24 ноября 2010

Я реализую всю проверку в модели представления, используя IDataErrorInfo, и позволяю модели представления решать, должна ли она передавать изменения свойства в модель на основе того, является ли свойство допустимым. Так что типичный сеттер выглядит примерно так:

public string Value
{
   set
   {
      if (value == _Value)
      {
         return;
      }
      _Value = value;
      Validate("Value");
      if (Error["Value"] == null)
      {
         Model.Value = value;
      }
      OnPropertyChanged("Value");
   }
}

Я никогда не применяю валидацию или преобразование значений в представлении. Это похоже на попрошайничество.

1 голос
/ 24 ноября 2010

Я бы использовал комбинацию.

Я использую Idataerrorinfo в своих сущностях (проверка отсутствует в модели представления) для основных бизнес-правил многократного использования. Мои сущности также могут подтвердить себя таким образом.

Затем я использую view ValidationRules для мест, где ошибка привязки не будет допущена для моей сущности, например, когда строка используется в качестве ввода в целочисленном текстовом поле.

...