自定义ValidationAttribute不起作用。始终返回true

时间:2015-06-08 23:51:26

标签: c# data-annotations

我已经创建了一个自定义ValidationAttribute类来检查我的应用程序中某个人的年龄:

public class MinimumAgeAttribute : ValidationAttribute
{
    public int MinAge { get; set; }

    public override bool IsValid(object value)
    {
        return CalculateAge((DateTime) value) >= MinAge;
    }

    private int CalculateAge(DateTime dateofBirth)
    {
        DateTime today = DateTime.Now;
        int age = today.Year - dateofBirth.Year;
        if (dateofBirth > today.AddYears(-age)) age--;
        return age;
    }
}

数据注释在字段上设置如下:

[MinimumAge(MinAge = 18, ErrorMessage = "Person must be over the age of 18")]   
public DateTime DateOfBirth;

我的UI中的绑定设置如下:

<DatePicker SelectedDate="{Binding SelectedPerson.DateOfBirth, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" Grid.Column="1"/>

例如,当我将日期(例如)设置为09/06/2007时,Validator.TryValidateObject始终返回true。

为什么呢?这似乎只影响我的自定义类,System.ComponentModel.DataAnnotations中提供的所有类都可以正常工作。

1 个答案:

答案 0 :(得分:0)

您的自定义ValidationAttribute类无法正常工作的原因是因为WPF在执行验证时没有(默认情况下)查看此类。验证的默认机制是实现IDataErrorInfo(适用于.NET 4.0及更早版本)或INotifyDataErrorInfo(.NET 4.5中引入)接口。如果您不想实现任何这些接口,那么您可以创建ValidationRule,但我更喜欢实现上面提到的接口。

你可以在网上找到很多关于如何做到这一点的例子,但是快速搜索一下blog post(我觉得这是一个非常彻底的快速扫描)。

修改

由于您似乎更热衷于使用数据注释而不是IDataErrorInfo / INotifyDataErrorInfo接口或验证规则,我认为Microsoft TechNet文章"Data Validation in MVVM"是使用数据注释进行验证的非常干净和彻底的实现。我自己阅读了解决方案并将其推荐给其他人。