WPF MVVM对VM上的passthrough属性进行验证

WPF MVVM对VM上的passthrough属性进行验证,wpf,validation,mvvm,Wpf,Validation,Mvvm,我试图在WPF+MVVM中使用IDataErrorInfo进行验证。我跟随了MSDN关于如何实现它的文章。问题是如何处理VM上的pass-through属性 比如说, public class A : INotifyPropertyChanged, IDataErrorInfo { protected string _Name; public string Name { get { return _Name;

我试图在WPF+MVVM中使用IDataErrorInfo进行验证。我跟随了MSDN关于如何实现它的文章。问题是如何处理VM上的pass-through属性

比如说,

public class A : INotifyPropertyChanged, IDataErrorInfo
{
    protected string _Name;
    public string Name
    {
        get
        {
            return _Name;
        }
        set
        {
            _Name = value;
            OnPropertyChanged("Name");
        }
    }

    public string this[string propertyName]
    {
        get
        {
            string result = null;

            if (propertyName == "Name")
            {
                if (Name == "ABC")
                {
                    result = "Name cannot be ABC";
                }
            }

            return result;
        }
    }
}

public class ViewModel : INotifyPropertyChanged
{
    A a = new A();

    public string ModelName
    {
        get
        {
            return a.Name;
        }
        set
        {
            a.Name = value;
            OnNameChanged();
            OnPropertyChanged("ModelName");
        }
    }
}    

<TextBox Name="txtName" Text="{Binding Path=ModelName, ValidatesOnDataErrors=True}" />
公共A类:INotifyPropertyChanged,IDataErrorInfo
{
受保护的字符串\u名称;
公共字符串名
{
得到
{
返回_Name;
}
设置
{
_名称=值;
不动产变更(“名称”);
}
}
公共字符串此[string propertyName]
{
得到
{
字符串结果=null;
如果(propertyName==“名称”)
{
如果(名称=“ABC”)
{
结果=“名称不能是ABC”;
}
}
返回结果;
}
}
}
公共类视图模型:INotifyPropertyChanged
{
A=新的A();
公共字符串模型名
{
得到
{
返回a.名称;
}
设置
{
a、 名称=值;
OnNameChanged();
OnPropertyChanged(“ModelName”);
}
}
}    
我必须在视图模型上做些什么,这样就不必在视图模型上再次验证Name属性


谢谢

您需要的是通过ViewModel公开整个Class A

这篇博文(并不完美,但)展示了一种简单的方法:


此外,您还对如何显示此主题的错误进行了有趣的讨论:

验证发生在具有绑定集的类上。在您的例子中,它是
视图模型
。如果必须具有传递属性,则只需在
ViewModel
上实现
IDataErrorInfo
,并使其也传递即可

//视图模型

public string this[string propertyName]
{
    get
    {
        if (propertyName == "ModelName")
        {
            return a["Name"];
        }

        return null;
    }
}

我不知道有什么办法可以避免在您的
视图模型上没有
IDataErrorInfo

您所说的
“再次”
是什么意思?如果您想验证一次,可以定义一个布尔属性(例如:
hasNameValidated
)。可能我不够清楚,类a是通过ViewModel公开的,当我直接绑定到模型时,IDataErrorInfo可以完美地工作。但是,有时我需要视图模型上的传递属性,以便在视图模型上执行某些操作。当这种情况发生时,我必须在视图模型上实现IDataErrorInfo,并像在模型上一样再次执行相同的验证。有什么办法可以避免这样做吗?谢谢,我没有想到这样做。我现在的做法是不在视图模型上使用pass-through属性。相反,我让视图模型监听来自模型的propertychanged事件,并在更改来自我关心的属性时进行处理。有没有什么退路可以让我不走这条路?