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

我创建了一个自定义的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中的绑定设置如下:

  

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

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

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

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


编辑

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