2012-12-12 41 views
4

什麼時候WPF請求命令是否可以執行?調試器報告它經常發生。 但確切的條件是什麼?WPF何時決定重新查詢命令是否可以執行?

+9

我認爲這取決於命令的類型。一個'RelayCommand'通常會在任何時候任何屬性改變時重新調用'CanExecuteChanged()'(我想通過運行[CommandManager.InvalidateRequerySuggested](http://msdn.microsoft.com/en-us/library/system.windows.input.commandmanager) invalidaterequerysuggested.aspx)任何時候一個屬性改變),而'DelegateCommand'不會,並且當它依賴於變化的屬性時,你必須手動提高'CanExecuteChanged'。另外,所有命令在綁定時都會被重新評估,所以隱藏然後顯示一個窗口通常會觸發一個查詢 – Rachel

+2

關於這個主題:[CommandManager.RequerySuggested如何工作?](http:// stackoverflow。 com/questions/2763630/how-does-commandmanager-requerysuggested-work)和[CanExecuteChanged和CommandManager.RequerySuggested的實際任務是什麼](http://stackoverflow.com/questions/6634777/what-is-the-actual -task-of-canexecutechanged-and-commandmanager-requerysuggested) – Blachshma

+0

關於這個問題的好主題:http://robburke.net/2008/04/wpf-command-pattern-when-does-it-query-canexecute/ –

回答

0

它的TL; DR版本是當窗口上發生某些輸入事件時調用CanExecute方法。主要有鍵盤和鼠標事件。

所以任何時候有人點擊或按下一個鍵,所有命令被CommandManager無效(通過提高CommandManager.RequerySuggested事件)。這是保持CanExecute方法快速重要的原因。

也可以通過創建不使用CommandManager作爲CanExecuteChanged事件的自定義ICommand來自己處理。

相關問題