2013-07-03 50 views
5

我有一個可以正常工作的C#WPF MVVM應用程序。關於丟失焦點的WPF RaisePropertyChanged事件

唯一的問題是當我修改一個文本框並單擊菜單。如果我這樣做,而不點擊另一個控件,view-> viewmodel事件永遠不會被觸發,因爲文本框沒有失去焦點。如果我錯了,請糾正我,但我認爲RaisePropertyChanged僅在LostFocus(或OnBlur,或任何類似事件)上觸發。

因此,在編輯文本框後單擊菜單保存按鈕會導致視圖模型使用舊值保存數據。

因此,恢復:

該序列正常工作:

  1. 編輯的文本框中
  2. 點擊另一個控制
  3. RaisePropertyChanged被激發,在視圖模型上更新
  4. 點擊保存按鈕
  5. 正確值保存的數據

該序列給我一個錯誤:

  1. 編輯在保存菜單按鈕
  2. 數據文本框中
  3. 點擊與正​​確的價值觀

如何解決這個保存?

回答

10

這是WPF和WinForms中TextBoxes的常見陷阱。您可以通過指示綁定系統在每次更改文本框時更新虛擬機,而不是在失去焦點時解決此問題。爲此,請將綁定的UpdateSourceTrigger設置爲PropertyChanged。這會在任何時候TextBox爲其Text屬性引發PropertyChanged事件而回寫給VM。

<TextBox Text="{Binding MyText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
8

對於TextBox.Text依賴屬性,它的默認UpdateSourceTriggerLostFocus(即,您的視圖模型屬性在控件失去焦點時得到更新)。要在輸入文本時立即更新屬性,請設置UpdateSourceTrigger=PropertyChanged。 (請參閱上面的鏈接以獲取更多信息 - 它實際上涵蓋了您的示例。)