gpt4 book ai didi

c# - 自定义 ValidationAttribute 不起作用。总是返回真

转载 作者:行者123 更新时间:2023-11-30 18:24:53 25 4
gpt4 key购买 nike

我创建了一个自定义的 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 中的绑定(bind)是这样设置的:

<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 中引入)接口(interface)。如果您不想实现任何这些接口(interface),那么您可以创建一个 ValidationRule,但我更喜欢实现上述接口(interface)。

您可以在网上找到很多关于如何执行此操作的示例,但通过快速搜索可以找到这个 blog post (快速扫描后我觉得非常彻底)。


编辑

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

关于c# - 自定义 ValidationAttribute 不起作用。总是返回真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30720865/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com