2012-11-28 115 views
7

我有一個WPF應用程序(.Net 3.5),它使用ViewModel上的IDataErrorInfo來驗證輸入。IDataErrorInfo:如何知道所有屬性是否有效?

它工作得很好,usercontrol得到正確的UI反饋。

問題是用戶仍然可以更改所選元素或保存此元素。

所以我的問題是:我怎麼知道我的所有屬性都是有效的?或者至少我所有顯示的值都是有效的。目標是在此結果上綁定一些IsActive

+0

如果錯誤屬性不爲空或空那麼將會出現錯誤 –

+0

你想知道它們是否全部有效?在View或ViewModel中? – Blachshma

+0

我認爲這個答案可能會幫助你:http://stackoverflow.com/questions/104520/wpf-validation-for-the-whole-form –

回答

15

從您的實現的IDataErrorInfo您的評論改變你實現這種風格....

#region IDataErrorInfo Members 

public string Error 
{ 
    get { return this[null] } 
} 

public string this[string columnName] 
{ 
    get 
    { 
     StringBuilder result = new StringBuilder(); 
     if (string.IsNullOrEmpty(columnName) || columnName == "FirstName") 
     { 
      if (string.IsNullOrEmpty(FirstName)) 
       result.Append("Please enter a First Name\n"); 
     } 
     if (string.IsNullOrEmpty(columnName) || columnName == "LastName") 
     { 
      if (string.IsNullOrEmpty(LastName)) 
       result.Append("Please enter a Last Name\n"); 
     } 
     if (string.IsNullOrEmpty(columnName) || columnName == "Age") 
     { 
      if (Age < = 0 || Age >= 99) 
       result.Append("Please enter a valid age\n"); 
     } 
     return (result.Length==0) ? null : result.Remove(result.Length-1,1).ToString(); 
    } 
} 

#endregion 


public bool IsValid { 
    get { return string.IsNullOrEmpty(this.Error); } 
} 

然後在你的屬性更改事件

if (e.PropertyName == "Error") { 
    OnPropertyChanged(this,new PropertyChangedEventArgs("IsValid")); 
} 
if (e.PropertyName != "Error" && e.PropertyName != "IsValid") { 
    OnPropertyChanged(this,new PropertyChangedEventArgs("Error")); 
} 
+0

哦,這就是錯誤的原因?我沒有理解,在我發現之前和所有例子中,這都沒有實現 – J4N

+1

@ J4N是的,錯誤應該是對象本身錯誤的總結,通常以這個答案中的總結形式完成。 –

+0

我修改了我的代碼以使用你的解決方案(幾乎,我仍然是一個包含布爾值的IsValid屬性,並且在事件更改元素中更新它) – J4N

0

現在,我在模型中添加了此方法。

public Boolean IsModelValid() 
    { 
     Boolean isValid = true; 
     PropertyInfo[] properties = GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); 

     foreach (PropertyInfo p in properties) 
     { 
      if (!p.CanWrite || !p.CanRead) 
      { 
       continue; 
      } 
      if (this[p.Name] != null) 
      { 
       isValid = false; 
      } 
     } 
     return isValid; 
    } 

我綁定的對象本身的PropertyChanged事件,

public MyClassName() 
    { 
     PropertyChanged += CheckModelValidity; 
     CheckModelValidity(null, null); 
    } 

,當它改變,我把這種方法,如果結果比我的實際公共成員不同,我更新:

private void CheckModelValidity(object sender, PropertyChangedEventArgs e) 
    { 
     bool isModelValid = IsModelValid(); 
     if(isModelValid!= IsValid) 
     { 
      IsValid = isModelValid; 
     } 
    } 

然後我可以只綁定IsValid屬性。

我不知道是否有更好的解決方案?

+5

令人討厭的是,每次發生屬性更改事件時都會使用反射.... –

+2

如果您要走這條路線,請將靜態構造函數中存儲它的有效屬性名稱列表初始化爲靜態字段。那麼你只有反射發生一次 –

+0

@BobVale是的,我也不爲此感到驕傲,但我更喜歡這樣做,以免有人忘記做一次檢查。很好,我會在一個靜態變量中初始化它。 – J4N

相關問題