有关MVVM验证的建议

时间:2010-11-24 10:33:54

标签: wpf mvvm idataerrorinfo validationrules

我很欣赏这可能听起来有些类似于其他一些问题,但我还没有找到一个完全满足我的查询,所以请光临我。我目前正在将我现有的一个应用程序转换为MVVM模式以改进其结构,并且我对于进行数据验证的最佳方式有点不知所措。

目前,应用程序使用数据绑定来链接UI和代码,并使用一些验证规则和值转换器,这些规则和值转换器可以在类似的值上重复使用(每个值对应日期等)。

在阅读MVVM的同时,我遇到了IDataErrorInfo,我发现它很有吸引力,因为它会将视图保留在视图之外,因此在设置绑定等时会略微减少重复代码,并允许更具体的错误消息。

另一方面,如果验证失败,ValidationRules会阻止绑定数据的传输,这是我需要的,因为我只希望模型值更改一个新的有效值。

我主要担心的是,如果我在视图模型中过多地限制了这会使视图中的事情变得困难 - 在一般情况下将事物限制在一个舒适的水平是一个好主意,然后补救需要的特定情况视野更灵活?

所以我的主要问题是,将验证和转换放在viewmodel的属性中还是坚持使用我的validationrules和valueconverters(或两者之间的某些妥协)会更好吗?

谢谢, 詹姆斯

2 个答案:

答案 0 :(得分:2)

我使用IDataErrorInfo在视图模型中实现所有验证,并让视图模型决定是否应根据属性是否有效将属性更改传递给模型。所以典型的setter看起来像:

public string Value
{
   set
   {
      if (value == _Value)
      {
         return;
      }
      _Value = value;
      Validate("Value");
      if (Error["Value"] == null)
      {
         Model.Value = value;
      }
      OnPropertyChanged("Value");
   }
}

我从未在视图中实现验证或值转换。这似乎就是在乞求麻烦。

答案 1 :(得分:1)

我会用一种组合。

我在我的实体中使用Idataerrorinfo(验证不在viewmodel中)用于核心可重用业务规则。我的实体也可以这样验证自己。

然后我将视图ValidationRules用于绑定错误不会进入我的实体的地方,例如在整数文本框中将字符串用作输入时。