Пользовательская проверка запускается только один раз - PullRequest
1 голос
/ 11 мая 2011

Я создаю приложение 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 никогда не будет достигнута. Почему это?

Спасибо

1 Ответ

0 голосов
/ 11 мая 2011

Я уверен, что каждый раз, когда я трачу достаточно много времени на борьбу с ошибкой, чтобы прибегнуть к публикации на SO, я выясняю, какой фактический ответ наступил через 20 секунд ... if (_otherPhone == value) return; заставлял проверку не запускаться - эта оптимизация имела бы смысл, если бы проверка не зависела от другого свойства.

Не бери в голову ...

...