2013-04-03 45 views
0

我正尝试在WPF + MVVM中使用IDataErrorInfo进行验证。我遵循MSDN关于如何实现它的文章。问题是,我如何处理VM上的传递属性?关于虚拟机上的直通属性的WPF MVVM验证

例如,

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}" /> 

我有什么做的视图模型,这样我就不必对视图模型再次重新验证Name属性?

谢谢

+0

你是什么意思再'“?如果你想验证一次,你可以定义一个布尔属性(例如:'hasNameValidated')。 – Haritha 2013-04-04 04:31:13

回答

0

你需要的是通过你的ViewModel公开你的整个类。

本博客文章(不完美但)显示一个简单的方法来做到这一点:你如何在这个题目显示错误上一个有趣的讨论http://www.eidias.com/Blog/2012/7/2/simple-validation-in-wpf-mvvm-using-idataerrorinfo

另外:MVVM pattern, IDataErrorInfo and Binding to display error?

+0

也许我还不够清楚,当我直接绑定到模型时,A类会通过ViewModel公开,并且IDataErrorInfo完美地工作。但是,我不时需要View模型的pass-through属性,以便在View模型上执行某些操作。发生这种情况时,我必须在View Model上实现IDataErrorInfo,并再次执行与我在模型上一样的验证。无论如何避免这样做? – user2242222 2013-04-04 15:07:20

0

验证发生在具有绑定集的类。在你的情况下,它是ViewModel。如果你必须有通经特性则只是实现对ViewModelIDataErrorInfo并有穿过也

//视图模型

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

     return null; 
    } 
} 

我不知道周围没有上的IDataErrorInfo方式ViewModel在你的情况下

+0

谢谢,没想到这样。我现在这样做的方式是不使用View Model的pass-through属性。相反,我得到View Model从Model中监听propertychanged事件,如果更改来自我关心的属性,则执行此操作。有没有退缩让我不能走这条路? – user2242222 2013-04-05 13:19:45