我正在尝试从Josh Smith的例子中实现数据验证技术:Using a viewmodel to provide meaningful validation...
我的代码与示例非常相似,除了一些区别,即我使用的是MVVM-Light工具包,而我的模型人类是来自WCF后端的部分类。
以下是相关代码的示例:
首先是来自WCF的类的自动生成版本:
public partial class Person : BaseObject
{
private string FooField;
public string Foo {
get {
return this.FooField;
}
set {
if ((object.ReferenceEquals(this.FooField, value) != true)) {
this.FooField = value;
this.RaisePropertyChanged("Foo");
}
}
}
然后我扩展了部分类来实现IDataErrorInfo:
public partial class Person : IDataErrorInfo
{
public string Error
{
get { return null;}
}
public string this[string propertyName]
{
if (propertyName == "Foo")
{
//Do some backend Validation
}
}
}
最后我有一个viewmodel:
public class PersonViewModel : INotifyProperyChanged, IDataErrorInfo
{
private string _fooString;
private Person _person;
...
public string Foo {
get { return _fooString; }
set
{
if (value == _fooString;)
return;
_fooString = value;
RaisePropertyChanged("Foo");
}
public string this[string propertyName]
{
if (propertyName == "Foo")
{
string msg = Validate(Foo); //Frontend Validation, range, format, etc.
if(msg ! = null)
return msg;
_person.Foo = Foo;
}
}
}
因此,当我绑定到viewmodel中的属性时,IDataErrorInfo的索引器中定义的验证代码将在视图模型和我的文本框上执行,或者如果我的验证失败,则会突出显示任何内容,如预期的那样。但是在我的代码中,MODEL端的Indexer根本就没有执行过。我可以诚实地说,我没有看到或理解应该调用它的机制。我已经从Josh Smith的例子中运行了示例代码,并且它确实有效,调用MV的这个[],然后如果验证通过模型的这个[]点击进行额外的验证,但我对我的生活看不出它是怎么回事发生的情况。
我真的希望这是一个简单的我忽略的东西。谢谢你看。
答案 0 :(得分:1)
你错过了
return _person[propertyName];
来自ViewModel中的索引器。