Silverlight MVVM中的验证错误消息

时间:2011-02-11 14:48:14

标签: silverlight mvvm mvvm-light validation

我正在尝试从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的这个[],然后如果验证通过模型的这个[]点击进行额外的验证,但我对我的生活看不出它是怎么回事发生的情况。

我真的希望这是一个简单的我忽略的东西。谢谢你看。

1 个答案:

答案 0 :(得分:1)

你错过了

return _person[propertyName];

来自ViewModel中的索引器。