自定义验证仅运行一次

时间:2011-05-11 11:09:17

标签: c# silverlight validation c#-4.0 data-annotations

我正在创建一个MVVM Silverlight应用程序,并且我正在尝试向我的模型添加验证。

在这个特定情况下,我有多个电话号码框,并要求必须输入至少一个电话号码。为了便于我在我的模型上使用CustomValidation属性修饰我的属性(HomePhone,WorkPhone,MobilePhone和OtherPhone)。

示例属性:

    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方法能够检查最新值。

当我尝试保存模型时,我正在View中的所有绑定上执行UpdateBindingExpression。现在,这可以正确地保存我尝试保存的第一个时间,并且所有四个字段都会突出显示为有错误。

但是,如果我再次尝试保存,则所有字段都标记为已通过验证,并且永远不会命中ValidatePhoneNumbers中的断点。这是为什么?

由于

1 个答案:

答案 0 :(得分:0)

我敢肯定,每次我花费足够长的时间来对抗错误以便在SO上发布,我会在20秒后找出实际答案的内容...... if (_otherPhone == value) return;导致验证没有运行 - 如果验证不依赖于另一个属性,则此优化将有意义。

没关系......