我正在创建一个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中的断点。这是为什么?
由于
答案 0 :(得分:0)
我敢肯定,每次我花费足够长的时间来对抗错误以便在SO上发布,我会在20秒后找出实际答案的内容...... if (_otherPhone == value) return;
导致验证没有运行 - 如果验证不依赖于另一个属性,则此优化将有意义。
没关系......