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

2024-01-03

我创建了一个自定义 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 中提供的所有类都工作正常。


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

您可以在网上找到很多有关如何执行此操作的示例,但是快速搜索发现了这个博客文章 http://blog.magnusmontin.net/2013/08/26/data-validation-in-wpf/(快速扫描后我觉得非常彻底)。


EDIT

由于您似乎更热衷于使用数据注释而不是 IDataErrorInfo/INotifyDataErrorInfo 接口或验证规则,我认为 Microsoft TechNet 文章《MVVM 中的数据验证》 http://social.technet.microsoft.com/wiki/contents/articles/22660.data-validation-in-mvvm.aspx#Merging_Validation_and_PropertyChanged_Notification是使用数据注释进行验证的非常干净和彻底的实现。我自己通读了该解决方案并将其推荐给其他人。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自定义 ValidationAttribute 不起作用。始终返回 true 的相关文章

随机推荐