2009-09-05 116 views
2

我有一個ViewModel實現了IDataErrorInfo和一個master-detail-view。當用戶在詳細信息視圖中點擊保存按鈕時,如何才能觸發當前ViewModel項目的顯示?按鈕點擊驗證ViewModel

+0

我很樂意回答這個問題,以及 – Charlie 2010-05-06 14:31:37

回答

4

首先在您的虛擬機上添加一個標誌,將其初始設置爲false。 在您的Button命令代碼中(假設您已將按鈕綁定到VM上的命令),請在運行驗證代碼之前打開該標誌。

在IDataErrorInfo屬性中的「get」代碼中,如果該標誌設置爲true,則僅返回驗證錯誤,否則返回空字符串。

在將標誌切換回false之前,用一個空字符串作爲屬性名稱引發PropertyChangedEvent,這將強制綁定系統重新評估當前上下文中的所有綁定,以及根據IDataErrorInfo檢查錯誤。

3

benPearce給出了很好的答案。

正如他指出的那樣。

  1. this[columnName]返回null,除非你點擊你需要調用OnPropertyChanged(null)讓WPF重新evaluete綁定保存命令中的「保存」
  2. (和查詢索引)(即使數據是無效的)

本示例不使用標誌,而是使用字典實現相同的結果。


查看

<TextBox Text="{Binding Surname, ValidatesOnDataErrors=True}" /> 

視圖模型

public string Surname { get; set; } 

#region Validation 
//http://blogs.msdn.com/b/bethmassi/archive/2008/06/27/displaying-data-validation-messages-in-wpf.aspx 
Dictionary<string, string> validationErrors = new Dictionary<string,string>(); 

void Validate() 
{ 
    validationErrors.Clear(); 
    if (srtring.IsNullOrWhitespace(Surname)) // Validate Surname 
    { 
     validationErrors.Add("Surname", "Surname is mandatory."); 
    } 

    //http://stackoverflow.com/a/5210633/240835 
    // Call OnPropertyChanged(null) to refresh all bindings and have WPF check the this[string columnName] indexer. 
    OnPropertyChanged(null); 
} 

#region IDataErrorInfo Members 
public string Error 
{ 
    get 
    { 
     if (validationErrors.Count > 0) 
     { 
      return "Errors found."; 
     } 
     return null; 
    } 
} 

public string this[string columnName] 
{ 
    get 
    {     
     if (validationErrors.ContainsKey(columnName)) 
     { 
      return validationErrors[columnName]; 
     } 
     return null; 
    } 
} 

#endregion 
#endregion 
public void Save() 
{ 
    Validate(); 
    if (validationErrors.Count == 0) 
    { 
     DoSave(); 
    } 
}