Я думаю, корень вашей проблемы в том, что ваша модель представления на самом деле не является моделью представления.
Каждое свойство в модели представления должно иметь тип, соответствующий представлению , а не модели данных. Если у вас есть числовое свойство в модели данных, и вы используете для редактирования текстовое поле в виде, свойство в модели представления должно быть строкой.
Свойства модели представления содержат значения, отображаемые в представлении, независимо от того, являются ли эти значения действительными. Единственное время, когда должно быть несоответствие между значением в представлении и значением в модели представления, - это когда фокус редактируемого элемента управления имеет значение, пользователь изменяет его значение, а привязка не возвращает новое значение обратно в представление. модели пока нет.
Если вы сделаете это таким образом, я думаю, что большинство проблем, которые вы здесь выразили, исчезнут. После того, как вы заполнили объект модели представления (предполагая, что вы реализовали проверку в его установщиках, и вы не обходите его установщики для непосредственного обновления полей поддержки свойств), его свойства действительны или нет независимо от того, является ли его представление был создан еще.
В моих классах модели представления я реализую свойство Dictionary<string, string>
с именем Errors
. Проверка в установщиках свойств заполняет Errors
ошибкой проверки каждого свойства или равна нулю, если свойство допустимо. Это делает реализацию IDataErrorInfo.Item
простой:
public string this[string propertyName]
{
get
{
return Errors.ContainsKey(propertyName) ? Errors[propertyName] : null;
}
}
Я также могу реализовать это свойство:
public bool IsValid { get { return !(Errors.Values(x => x != null).Any()); } }
, который можно использовать везде, где мне нужно проверить, чтобы убедиться, что текущее состояние модели представления действительно - скажем, в свойстве CanExecute
Command
.