2010-11-24 65 views
1

验证我明白这听起来可能有点类似于一些其他的问题,但我还没有找到一个这相当符合我的查询,所以请与我裸露的需要。我目前正在将其中一个现有的应用程序转换为MVVM模式,以改善其结构,并且对于执行数据验证的最佳方式我有点不解。咨询关于MVVM

目前应用程序使用的数据绑定到UI和代码链接,并且使用一些验证规则并且可以在相似的值(每一个用于日期之一,等等)被重用值转换器。

在阅读MVVM时,我遇到了IDataErrorInfo,我觉得它很有吸引力,因为它会保持验证不在视图中,因此在设置绑定等时略微减少重复代码,并允许更具体的错误消息。如果验证失败,这是我需要的,因为我只想要的模型值来改变一个新的,有效的值提供,从另一方面

ValidationRules块结合的数据传输。

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

所以我的主要问题是,将视图模型的属性进行验证和转换,还是使用我的validationrules和valueconverters(或两者之间的某种折衷方案)更好?

谢谢, 詹姆斯

回答

2

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

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

我永远不会实现的观点验证或价值转换。这只是乞求麻烦。

+0

谢谢,我有类似的想法,但不知道是否是正确的方式去做事情。我认为让视图模型处理所有这些东西是正确的路要走。 – Moonshield 2010-11-25 10:06:12

1

我会用一个组合。

我用IDataErrorInfo的在我的实体(验证是不是在视图模型)核心可重用的业务规则。我的实体也可以这样验证自己。

然后我用视图ValidationRules对地方有约束力的错误不会使它到我的实体,当一个字符串作为一个整数文本框中输入如。

+0

嗯,这就是那种我的想法是在前进的方向的,这似乎是一个不错的主意,让这一切在一个地方,但有点不切实际。我想我可以在视图/绑定中进行类型检查等,以使验证规则更通用,然后在将其推回模型之前检查值。 – Moonshield 2010-11-24 12:22:09