我遇到了一個我以非優雅方式解決的問題,並且想知道是否有更好的解決方案。在非可聚焦控件上執行某些操作時強制綁定更新
我有一個視圖,它可能只有在失去焦點時更新其綁定的文本框(它們的綁定屬性使用UpdateSourceTrigger=LostFocus
)。這是「幾乎」正確的...我可以將綁定的UpdateSourceTrigger
設置爲PropertyChanged
,我不會遇到任何問題,並且所有內容都可以按預期工作......但是,在更新綁定時會發生一些潛在的計算耗資巨大的問題屬性(涉及可能會變長的編輯對象的深層檢查),所以實際上我只想在完成編輯後更新綁定。
這是擺在工具欄的問題,因爲它們的按鈕不可聚焦,所以單擊它們(併發出命令)實際上並沒有使文本框失去焦點,因此當執行該命令時,綁定沒有更新(想想一個實體編輯視圖,帶有一個工具欄的「保存」按鈕,當點擊時調用一個保存命令,實際上保存了實體,在這種情況下,實體會在失去焦點之前保存爲文本框的值)
我能提高命令之前檢查綁定和更新源(這是我現在在做什麼),但是這意味着,無論是:
- 有權訪問執行命令的綁定(或控件)。這是因爲解決方案的完整不合理而丟棄的。命令行爲在其他一些應該與WPF無關的庫上定義。
- 在提出命令之前,在代碼隱藏事件處理程序上執行該命令並執行綁定更新(或僅將焦點設置爲其他內容並讓WPF更新源)。這就是我現在正在做的,這是我不喜歡的(如果還有其他解決方案,我更願意將命令直接分配給工具欄按鈕)。
- 讓View接口有一個「ForceEndEdit()」,視圖執行並在我執行某個可能會導致此問題的操作時調用它。我覺得這很奇怪,寧願不這樣做。
有沒有辦法告訴WPF更新綁定「當用戶調用 - 或者點擊控件不一定失去焦點之外的按鈕 - 命令」?在沒有的情況下,你們有沒有找到解決這個問題的辦法,比上面提出的更優雅,我可能沒有想到?
正如我所說的,觸發綁定更新OnPropertyChanged
(這是我所見過的類似的 - 雖然不完全相同的問題)不是一個很好的解決方案在這種特殊情況下。
PS:這不僅僅是文本框,而是任何類型的編輯控件(日期選擇器,範圍選擇器等),這些控件可能是第三方的,我不一定有權訪問它們的源代碼碼。
PS2:我使用.NET 4.5
您使用的是什麼版本的.NET? – toadflakz 2014-12-01 15:29:31
4.5,對不起,會加入到問題 – Jcl 2014-12-01 15:30:17