2013-04-03 63 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