我很欣赏这可能听起来有些类似于其他一些问题,但我还没有找到一个完全满足我的查询,所以请光临我。我目前正在将我现有的一个应用程序转换为MVVM模式以改进其结构,并且我对于进行数据验证的最佳方式有点不知所措。
目前,应用程序使用数据绑定来链接UI和代码,并使用一些验证规则和值转换器,这些规则和值转换器可以在类似的值上重复使用(每个值对应日期等)。
在阅读MVVM的同时,我遇到了IDataErrorInfo,我发现它很有吸引力,因为它会将视图保留在视图之外,因此在设置绑定等时会略微减少重复代码,并允许更具体的错误消息。
另一方面,如果验证失败,ValidationRules会阻止绑定数据的传输,这是我需要的,因为我只希望模型值更改一个新的有效值。
我主要担心的是,如果我在视图模型中过多地限制了这会使视图中的事情变得困难 - 在一般情况下将事物限制在一个舒适的水平是一个好主意,然后补救需要的特定情况视野更灵活?
所以我的主要问题是,将验证和转换放在viewmodel的属性中还是坚持使用我的validationrules和valueconverters(或两者之间的某些妥协)会更好吗?
谢谢, 詹姆斯
答案 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用于绑定错误不会进入我的实体的地方,例如在整数文本框中将字符串用作输入时。