WPF MVVM对VM上的passthrough属性进行验证
我试图在WPF+MVVM中使用IDataErrorInfo进行验证。我跟随了MSDN关于如何实现它的文章。问题是如何处理VM上的pass-through属性 比如说,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;
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事件,并在更改来自我关心的属性时进行处理。有没有什么退路可以让我不走这条路?