Как-то раньше меня данный вопрос так не волновал, а тут никак не могу определиться как лучше сделать.
VM часто сводится к набору свойств вида:
public int Value
{
get
{
return model.Value;
}
set
{
model.Value = value;
OnPropertyChanged();
}
}
при разработке GUI есть такая рекомендация: давать пользователю вводить почти что угодно, но помечать как ошибка и максимально понятно описывать ошибку.
Допустим, мне в TextBox нужно ввести озвученный выше Value.
Стандартных подхода вроде бы 3:
1) в set'ере кидать исключения — как-то слишком жёстко и потом наличие ошибок собирать в VM как-то не очевидно и сильно привязано к WPF
2) ValidationRule — для каждой проверки создавать свой класс выглядит не очень хорошо
3) IDataErrorInfo/INotifyDataErrorInfo — не получится поймать ошибку, когда в TextBox ввели текст
Можно комбинировать подход 1 и 3, но как-то тоже не выглядит хорошим решением.
В простых случаях в VM просто создавал Value как string, а не int и уже в методе валидации проверял на ошибку приведения к числу.
Везде так делать как-то тоже не выглядит хорошей идеей.
Кроме данного случая есть и всякие enum, которые в модели не nullable, а вот в окне вполне может пользователь ничего не выбрать.
А еще всякие составные проверки, когда А < Б и более сложные определения.
Какая-то может есть устоявшаяся практика, где нормально вся валидация собирается в одном месте и ViewModel знает есть ли в ней ошибки без переборов контролов и т.п.?
Сколько ни пытался найти информации, а везде только простейшие примеры, показывающие как всё легко и просто.