2012-09-05 68 views
3

我有一個文本框綁定到一個屬性,我已經將其UpdateSourceTrigger屬性設置爲Explicit,以便我可以控制它何時驗證。但是,只要UI加載控件驗證。我從來不會爲後面的代碼調用UpdateSource方法。我不知道爲什麼會發生這種情況,但我不知道如何解決。WPF UpdateSourceTrigger

是有一個原因UpdateSourceTrigger="Explicit"不工作?

請幫忙! 謝謝!

編輯: 最初文本框爲空時,驗證時,將導致驗證錯誤。我想避免這種情況。我只想在文本框失去焦點時顯式驗證,或者我點擊驗證按鈕。現在,如果我正確地理解了這一點,我需要做的就是調用TextBox_LostFocus處理程序中BindingExpression的UpdateSource方法以及按鈕的Click事件處理程序。但是,我無法弄清楚如何避免初始驗證,或者直到我點擊TextBox時才避免驗證。我使用了一種解決方法(我不喜歡),但我寧願找到一個更好的方法來做到這一點。

我使用的是MVVM,是的。謝謝你的解釋!這非常有幫助。

進一步編輯: 是的,我使用IDataErrorInfo的

+1

你可以複製和粘貼你使用的XAML ....謝謝。 –

回答

6

這是正常的行爲。

DependencyProperty中指定的綁定表達式(即本例中的Text)將在初始化/加載元素時執行初始綁定(並且從源更新目標...即設置TextBox的Text屬性到指定路徑的源文件中的屬性值(nb忽略目前未指定路徑的情況))。

UpdateSourceTrigger="Explicit"只是停止自動更新目標中的值(即TextBox的Text屬性)而不發送給源(例如ViewModel/model)....(不要將此選項與控制目標的更新)。

在初始綁定期間,我會想象綁定引擎會看到「源」有一個IDataErrorInfo,因此它會檢查「item」是否有效......如果不是,則會得到標準錯誤圍繞着你的TextBox(由ErrorTemplate定義)......的裝飾者,以便它匹配模型中數據的狀態......這是合乎邏輯的。

要停止所有顯示的錯誤指標視圖的初始加載後過於激進......你可以嘗試這種解決方法。

讓你在什麼時候會進行有效性檢查邏輯控制你可以改變你IDataErrorInfo的。

有觀點已經被加載後,時設置一個標誌......它允許運行IDataErrorInfo的驗證碼...而不是之前。

從這一點一旦裝上,呼籲UpdateSource將大火將捕獲無效數據的驗證(因爲您的加載標誌將是真實的,您的驗證邏輯會做它的魔力)。

你可以使用這樣的事情:

public class CustomerViewModel : IDataErrorInfo 
{ 
    public bool DoValidation { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 

    public string Error 
    { 
     get 
     { 
      if (DoValidation) 
      { 
       if (error on any properties) 
        return "error on these ....."; 
      } 
      return null; // no errors 
     } 
    } 

    public string this[string columnName] 
    { 
     get 
     { 
      if (!DoValidation) 
      { 
       return null; 
      } 

      string result = null; 
      if (columnName == "FirstName") 
      { 
       if (string.IsNullOrEmpty(FirstName)) 
        result = "Please enter a First Name"; 
      } 
      if (columnName == "LastName") 
      { 
       if (string.IsNullOrEmpty(LastName)) 
        result = "Please enter a Last Name"; 
      } 

      return result; 
     } 
    } 
} 

在模型上設置的DoValidation性質已經發生Loaded事件之後。

相關問題