2010-06-06 47 views
10

我正在寫使用MVVM模式一個WPF應用程序的基礎上,下面的文章:WPF Apps With The Model-View-ViewModel Design Pattern程序上的重新評估「可以執行」狀態

我有我的查看與按鍵「兩個按鈕命令「屬性(通過數據綁定)綁定到RelayCommand類的給定實例(請參閱上文中的」圖3 RelayCommand類「)。 RelayCommand類支持檢查是否可以執行給定的命令。

WPF自動禁用其命令無法執行的按鈕。

我的每個命令(在ViewModel類中)都會啓動後臺操作,並且在後臺操作完成之前不能再次執行該命令。 RelayCommand實例具有後臺操作是否仍在工作或完成的信息。

我的問題是:按下任何按鈕後,按鈕會自動禁用(這是OK),因爲後臺操作已啓動,並且該命令無法執行直到它完成,但操作完成後,這些按鈕不會自動啓用,因爲它們的命令的「可執行」謂詞不會自動重新評估。通過讓應用程序鬆動並重新獲得焦點(通過按ALT + TAB),可以手動觸發重新評估。做完這個竅門後,這些按鈕再次啓用。

如何以編程方式重新評估按鈕的命令的「可執行」狀態?

回答

20

您可以撥打InvalidateRequerySuggested CommandManager上以通知CanExecute應重新查詢:

CommandManager.InvalidateRequerySuggested(); 

http://msdn.microsoft.com/en-us/library/system.windows.input.commandmanager.invalidaterequerysuggested.aspx

這不依賴於特定的ICommand執行是否正確實施ICommand.CanExecuteChanged模式,所以YMMV。

更新

舉例來說,我用棱鏡它有它自己的基實現的ICommand:DelegateCommand。我發現在Prism的DelegateCommand中爲我調用RaiseCanExecuteChanged()。

更新2

,並確保你是在UI線程上調用InvalidateRequerySuggested()。如有必要,請使用調度員撥打電話。

+0

這與我第一次猜測的情況完全相同,但對我而言,這似乎並不奏效。 每次程序狀態(如Idle,Working,PendingStop等)發生更改時,我都會調用此靜態方法(「CommandManager.InvalidateRequerySuggested」),它只是在canExecute處理程序中使用的此狀態屬性。 儘管如此,它似乎並沒有工作(儘管我同意它應該)。 順便說一句,去檢查ICommand的實現,它在我之前引用的文章中,圖3. – dzs 2010-06-06 16:28:54

+0

是的,它確實取決於ICommand的實現方式。我已經更新了我的答案,詳細說明了如何在Prism中重新查詢CanExecute。我會看看你正在關注的文章。 – 2010-06-06 16:35:01

+0

這是否可能與在非UI線程上執行InvalidateRequerySuggested()有關?嘗試使用Dispatcher來調用它,以便在UI線程上調用它。 – 2010-06-06 16:37:22