1

在我正在处理的 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 示例一样。

总结一下——我的问题是——我应该继续走这条路,还是应该使用不同的验证方案?

4

2 回答 2

1

对我来说似乎是一种有效的方法,您仍然可以使用DisplayName等获得不错的消息。对于完整的消息,您可以拥有一个带有键的属性,然后在资源文件中查找该键。

于 2012-08-03T02:28:45.603 回答
1

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

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

因此,您可以对名为“FirstName”的属性的消息进行美化,您可以在消息中显示为“First Name is required...”。

此外,只要您完成了将基类中的所有内容连接到 IDataErrorInfo 的工作,那么您就可以在 WPF 应用程序中获得成功。它确实使您的代码更加简洁,并最大限度地减少了您必须编写的内容(如果您需要自定义验证属性,则除外)。

于 2012-08-03T03:25:52.647 回答