【发布时间】:2011-06-25 14:45:37
【问题描述】:
我正在尝试实施 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
}
}
}
最后我有一个视图模型:
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;
}
}
}
因此,当我绑定到视图模型中的属性时,IDataErrorInfo 的索引器中定义的验证代码会在视图模型和我的文本框上执行,或者如果我的验证失败,则会像预期的那样突出显示任何内容。然而,在我的代码中,模型端的索引器根本不会被执行。老实说,我没有看到或理解应该调用它的机制。我已经运行了 Josh Smith 的示例中的示例代码,它确实有效,调用了 MV 的 this[],然后如果验证通过了模型的 this[] 命中以进行额外的验证,但我这辈子看不到它是如何实现的发生。
我真的希望这是我忽略的简单事情。感谢您的关注。
【问题讨论】:
标签: silverlight mvvm mvvm-light validation