我已经创建了一个自定义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中提供的所有类都可以正常工作。
答案 0 :(得分:0)
您的自定义ValidationAttribute类无法正常工作的原因是因为WPF在执行验证时没有(默认情况下)查看此类。验证的默认机制是实现IDataErrorInfo(适用于.NET 4.0及更早版本)或INotifyDataErrorInfo(.NET 4.5中引入)接口。如果您不想实现任何这些接口,那么您可以创建ValidationRule,但我更喜欢实现上面提到的接口。
你可以在网上找到很多关于如何做到这一点的例子,但是快速搜索一下blog post(我觉得这是一个非常彻底的快速扫描)。
由于您似乎更热衷于使用数据注释而不是IDataErrorInfo / INotifyDataErrorInfo接口或验证规则,我认为Microsoft TechNet文章"Data Validation in MVVM"是使用数据注释进行验证的非常干净和彻底的实现。我自己阅读了解决方案并将其推荐给其他人。