2011-08-24 25 views
2

我使用RelayCommand的標準Josh Smith實現在我的WPF/MVVM應用程序中實現ICommands。請參閱:WPF Apps with the MVVM Design Pattern如何或何時清理WPF/MVVM中的RelayCommand對象?

我的一些CanExecute方法需要很長時間才能運行。單獨而言,它們並不差(每個都是零點幾秒)。但我注意到,我綁定到我的UI的命令越多,應用程序響應越慢(延遲超過10秒 - 惡作劇)。

我相信這是因爲RelayCommand CanExecuteChanged掛接到CommandManager.RequerySuggested事件上,我的ViewModel模板調用CommandManager.InvalidateRequerySuggested()作爲IDataErrorInfo驗證的一部分。

我的ViewModels實現了IDisposable,所以我試圖利用OnDispose方法來清理我的RelayCommands,但ICommand.CanExecute方法甚至在我的VM被處置後仍然被調用。

這使我得出結論,某事(CommandManager?,視圖?)持有對RelayCommand的引用。

有沒有人有一個很好的釋放和處理RelayCommands模式,以防止它們在期望的生命週期過期後被重新查詢?

有沒有更好的方法來管理什麼時候應該調用CanExecute?

+1

CanExecute被調用的頻率很高,所以強烈建議這是一個快速計算。如果您有更復雜的標準,我建議根據狀態更改時的計算將結果緩存到字段或屬性中,而不是在請求狀態時進行。 –

+0

所以你的意思是,「如果它傷害了,那就不要那樣做」。我認爲這只是答案的一半。我同意CanExecute經常被調用,並且應該很快響應。不幸的是,在處理併發時,我仍然需要查詢數據庫來評估商業規則。是的,這會造成競爭狀況,但我寧願不在客戶端緩存驗證結果以擴大窗口。這仍然沒有回答在命令過期後如何停止對CanExecute的不必要調用的問題。 –

+0

針對當前問題的一個建議是修改RelayCommand以實現IDisposable,以便您明確地處置它,然後在處理完它後忽略後續的CanExecute請求。雖然它仍然被稱爲是有點好奇;您的視圖是否仍然綁定到您的(處置)ViewModel? –

回答