Я создаю приложение MVVM Silverlight и пытаюсь добавить проверку в мою модель.
В этом конкретном случае у меня есть несколько ящиков с номерами телефонов, и мне необходимо ввести хотя бы один номер телефона. Для этого у меня есть свойства (HomePhone, WorkPhone, MobilePhone и OtherPhone) на моей модели, украшенные атрибутом CustomValidation.
Пример свойства:
private string _otherPhone;
[CustomValidation(typeof(MyModel), "ValidatePhoneNumbers")]
public string OtherPhone
{
get { return _otherPhone; }
set
{
if (_otherPhone == value) return;
_otherPhone = value;
Validator.ValidateProperty(value, new ValidationContext(this, null, null) { MemberName = "OtherPhone" });
RaisePropertyChanged(() => HomePhone);
RaisePropertyChanged(() => WorkPhone);
RaisePropertyChanged(() => MobilePhone);
RaisePropertyChanged(() => OtherPhone);
}
}
Вместе с самим пользовательским валидатором:
public static ValidationResult ValidatePhoneNumbers(string number, ValidationContext validationContext)
{
MyModel myModel = (MyModel)validationContext.ObjectInstance;
return string.IsNullOrEmpty(myModel.HomePhone) && string.IsNullOrEmpty(myModel.WorkPhone) && string.IsNullOrEmpty(myModel.MobilePhone) && string.IsNullOrEmpty(myModel.OtherPhone)
? new ValidationResult("At least one phone number must be entered")
: ValidationResult.Success;
}
Я убедился, что резервное хранилище установлено в установщике свойств до запуска проверки, чтобы метод ValidatePhoneNumbers мог проверять последнее значение.
Когда я пытаюсь сохранить свою модель, я выполняю выражение UpdateBindingExpression для всех привязок в представлении. Теперь это работает правильно первый раз, когда я пытаюсь сохранить, и все четыре поля выделены как имеющие ошибку.
Если я попытаюсь сохранить снова, все поля будут помечены как прошедшие проверку, и точка останова в ValidatePhoneNumbers никогда не будет достигнута. Почему это?
Спасибо