CompareAttribute for WPF?

时间:2014-07-21 11:19:53

标签: c# wpf validation idataerrorinfo

有没有人知道WPF的CompareAttribute数据注释,或者在WPF中实现相同结果的方法?

对于那些不能立即知道的人,CompareAttribute是一个用于在WPF中验证的属性数据注释,它为第二个属性接受一个字符串,如果装饰属性和传递的属性匹配,则返回true。

基本上我需要验证密码更改表单,以确保“重新输入的密码”与新密码匹配,并使用数据注释执行此操作,以便我可以使用xaml验证模板。

2 个答案:

答案 0 :(得分:0)

您可以创建自己的CustomValidationAttribute描述here来创建自己的自定义验证逻辑。

答案 1 :(得分:0)

尝试像这样的自定义验证器

    public class EqualsValidationAttribute : ValidationAttribute
{
    string propertyToCompare;
    public EqualsValidationAttribute(string propertyToCompare)
    {
        this.propertyToCompare = propertyToCompare;
    }

    public EqualsValidationAttribute(string propertyToCompare,string errorMessage):this(propertyToCompare)
    {
        this.ErrorMessage = propertyToCompare;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var propInfo=validationContext.ObjectInstance.GetType().GetProperty(propertyToCompare);
        if (propInfo != null)
        {
            var propValue=propInfo.GetValue(validationContext.ObjectInstance);
            if(value!=null && propValue!=null && !string.IsNullOrEmpty(value.ToString()) && !string.IsNullOrEmpty(propValue.ToString()) //if either one is empty dont Validate
                && (value.ToString() != propValue.ToString()))
                return new ValidationResult(ErrorMessage);
        } 
        else
            throw new NullReferenceException("propertyToCompare must be the name of property to compare");

        return ValidationResult.Success;
    } 
}
  

并在像这样的实体中使用它

    [Required(ErrorMessage="Password Required")]
    public string Password {
        get { return password; }
        set { password = value; RaisePropertyChanged("Password"); }
    }

    [EqualsValidationAttribute("Password", ErrorMessage = "Confirm password must be same as password")]
    public string ConfirmPassword {
        get { return confirmedpassword; }
        set { confirmedpassword = value; RaisePropertyChanged("ConfirmPassword"); }
    }
}