Атрибуты
DataAnnotation
можно применять и к ViewModel
.Но проблемы все те же:
- Бросок исключений при ошибках валидации - шум в окне вывода
- Установка некоторого значения по умолчанию для свойства, выбрасывание исключений и установка недопустимого состояния
- Невозможно полностью проверить модель и получить все ее ошибки.
- Невозможно добавить или удалить ошибки в коде.
Преимущество заключается в простоте сравнения данных в сравнениидругими способами.
С другой стороны, интерфейс INotifyDataErrorInfo
позволяет выполнять проверку асинхронно.Как упоминалось в другом ответе, если вы хотите проверить, существует ли уже имя пользователя в базе данных, вы можете отправить запрос в службу и добавить ошибку в пользовательский интерфейс после получения асинхронного обратного вызова.
Я предпочитаю использовать INotifyDataErrorInfo
, и хотя он требует больше кода, чем аннотаций данных, его можно уменьшить, создав своего рода универсальный класс валидатора:
this.Validator = new ModelValidator<ProfileViewModel>(this);
this.Validator.AddValidationFor(() => this.SelectedCountry).NotNull().Show("Select country");
this.PropertyChanged += new PropertyChangedEventHandler(this.ValidateChangedProperty);