2014-12-01 34 views
1

我遇到了一個我以非優雅方式解決的問題,並且想知道是否有更好的解決方案。在非可聚焦控件上執行某些操作時強制綁定更新

我有一個視圖,它可能只有在失去焦點時更新其綁定的文本框(它們的綁定屬性使用UpdateSourceTrigger=LostFocus)。這是「幾乎」正確的...我可以將綁定的UpdateSourceTrigger設置爲PropertyChanged,我不會遇到任何問題,並且所有內容都可以按預期工作......但是,在更新綁定時會發生一些潛在的計算耗資巨大的問題屬性(涉及可能會變長的編輯對象的深層檢查),所以實際上我只想在完成編輯後更新綁定。

這是擺在工具欄的問題,因爲它們的按鈕不可聚焦,所以單擊它們(併發出命令)實際上並沒有使文本框失去焦點,因此當執行該命令時,綁定沒有更新(想想一個實體編輯視圖,帶有一個工具欄的「保存」按鈕,當點擊時調用一個保存命令,實際上保存了實體,在這種情況下,實體會在失去焦點之前保存爲文本框的值)

我能提高命令之前檢查綁定和更新源(這是我現在在做什麼),但是這意味着,無論是:

  • 有權訪問執行命令的綁定(或控件)。這是因爲解決方案的完整不合理而丟棄的。命令行爲在其他一些應該與WPF無關的庫上定義。
  • 在提出命令之前,在代碼隱藏事件處理程序上執行該命令並執行綁定更新(或僅將焦點設置爲其他內容並讓WPF更新源)。這就是我現在正在做的,這是我不喜歡的(如果還有其他解決方案,我更願意將命令直接分配給工具欄按鈕)。
  • 讓View接口有一個「ForceEndEdit()」,視圖執行並在我執行某個可能會導致此問題的操作時調用它。我覺得這很奇怪,寧願不這樣做。

有沒有辦法告訴WPF更新綁定「當用戶調用 - 或者點擊控件不一定失去焦點之外的按鈕 - 命令」?在沒有的情況下,你們有沒有找到解決這個問題的辦法,比上面提出的更優雅,我可能沒有想到?

正如我所說的,觸發綁定更新OnPropertyChanged(這是我所見過的類似的 - 雖然不完全相同的問題)不是一個很好的解決方案在這種特殊情況下。

PS:這不僅僅是文本框,而是任何類型的編輯控件(日期選擇器,範圍選擇器等),這些控件可能是第三方的,我不一定有權訪問它們的源代碼碼。

PS2:我使用.NET 4.5

+0

您使用的是什麼版本的.NET? – toadflakz 2014-12-01 15:29:31

+0

4.5,對不起,會加入到問題 – Jcl 2014-12-01 15:30:17

回答

2

如果你正在做的事情時OnPropertyChanged()UpdateSourceTrigger=PropertyChanged計算成本,你應該考慮在Binding所以使用DelayBinding更新一次用戶已經停止進入控制中的一個值。

這可以解決您的問題,因爲它是基於時間的交互而不是依賴於其他事件/發生在啓動更新之前。這個屬性在.NET 4.5中是新的,這就是爲什麼我問你正在使用什麼版本的.NET。

+0

這在某些情況下(實際上大多數,但不是全部)有效,'延遲'只會延遲更新源,而不是目標......這將需要一些重大更改該項目因爲我的許多視圖是自動生成的,並且「常用」綁定源和目標被交換(編輯控件是目標,而不是源)。我看到這可能是奇怪的,但是當我這樣做時(我的無知,我認爲)我認爲這是雙向的,這並不重要。 我會考慮改變它並回到你的含義(我想知道爲什麼Delay只能用於Source)。 – Jcl 2014-12-01 15:39:11

+0

順便說一句,我是upvoting,因爲這將是一個正常定義的視圖「正確優雅」的解決方案...如果我真的改變如何生成視圖,並使綁定「正確」,我會標記它作爲答案。同時,我會聽取其他潛在的解決方案:-) – Jcl 2014-12-01 15:43:21

+0

「編輯控制是目標,而不是源」......嗯。這是正常的方式? 'ViewModel'是數據源(Source),編輯控件作爲數據目標(Target),所以你的意思是你有編輯控件作爲Source? O_o – toadflakz 2014-12-01 15:46:50

相關問題