gpt4 book ai didi

c# - 使用属性属性在MVVM中进行验证

转载 作者:行者123 更新时间:2023-12-03 10:29:34 24 4
gpt4 key购买 nike

在WPF项目中,我正在考虑通过 View 模型属性的属性来实现数据验证。

例子:

[RegexConstraint("^[A-Z][a-zA-Z]+$")]
public string Name
{
set
{
_name = value;
OnPropertyChanged("Name")
}
}

我所有的 View 模型都继承自一个通用的ViewModelBase类,该类实现了IDataErrorInfo。索引器:
string IDataErrorInfo.this[string columnName]

按名称检索属性(使用反射),
var properties = GetType().GetProperties().Where(p=> p.Name == "someName")

查找所有约束属性...
private static ICollection<IValidator> GetValidations(PropertyInfo property)
{
return (ValidationAttribute[])property.GetCustomAttributes(typeof(ValidationAttribute), true))
.Select(va => new AttributeValidator(va)).Cast<IValidator>().ToList();
}

...并执行验证

看来可行,但是我的问题是-是否有人有使用类似技术的经验?那是个坏主意吗?

它的确使我的代码看起来更简洁,更简洁,并且避免了在所有 View 模型类中都必须实现IDataErrorInfo的问题,但另一方面,这又产生了一个新问题-当验证逻辑依赖于属性时,如何构造漂亮的用户消息名称/属性名称,而不是使用硬编码的消息-就像我能够找到的所有IDataErrorInfo示例一样。

总结-我的问题是-我应该继续走这条路,还是应该使用其他验证方案?

最佳答案

我已经在几个不同的项目上完成了类似的技术,并且您可以控制大多数DataAnnotation属性上的错误消息,以使其更加友好。这是一个完全可行的解决方案,因为我们最近在两个较大的WPF项目中进行了此操作,目前在第三个项目中正在做相同的事情。需要注意的是...我们确实发现自己必须创建许多自定义DataAnnotation类来处理许多复杂的业务规则,因此这取决于围绕数据的业务规则的复杂性。如果您主要能够使用大多数现成的DataAnnotations支持应用程序中的验证,那么您将不会面临同样的挑战。就错误消息而言,您可以在DataAnnotation属性上设置named属性,例如:

    [Required(ErrorMessage = "Title is required.")]

因此,您可以为名称为“FirstName”的属性添加消息,您可以在消息中将其显示为“First Name is required ...”。

另外,只要您完成了将基类中的所有内容都连接到IDataErrorInfo的工作,那么您在WPF应用程序中就很聪明了。它的确使您的代码更加简洁,并最大程度地减少了您必须编写的内容(除非需要定制验证属性)。

关于c# - 使用属性属性在MVVM中进行验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11788410/

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