【发布时间】:2025-11-27 11:05:03
【问题描述】:
在我正在处理的 WPF 项目中,我正在考虑通过视图模型属性上的属性来实现数据验证。
例子:
[RegexConstraint("^[A-Z][a-zA-Z]+$")]
public string Name
{
set
{
_name = value;
OnPropertyChanged("Name")
}
}
我所有的视图模型都继承自一个通用的 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();
}
...并执行验证
这似乎可行,但我的问题是 - 有没有人有使用类似技术的经验?这是个坏主意吗?
它确实使我的代码看起来更简洁,并且我避免在我的所有视图模型类中实现 IDataErrorInfo,但另一方面它产生了一个新问题 - 如何构造漂亮的用户消息,当验证逻辑依赖于属性名称/属性名称,而不是使用硬编码的消息——就像我能找到的所有 IDataErrorInfo 示例一样。
总结 - 我的问题是 - 我应该继续走这条路,还是应该使用不同的验证方案?
【问题讨论】:
-
Hy Jakub,我正在尝试在我的 ViewModelBase 上实现 IDataErrorInfo,也许您可以与我分享一些技巧?我最困惑的部分是“按名称检索属性(使用反射),找到所有约束属性,并执行验证”
-
Juan Pablo - 我编辑了我的问题并添加了一些代码来帮助您入门。
标签: c# wpf validation mvvm attributes