MSDN только указывает это
Происходит, когда CommandManager обнаруживает условия, которые могли бы изменить способность команды выполниться.
Однако я, может казаться, не нахожу трассировок того, как это работает, о чем я должен знать / избегают и т.д... Это просто прислушивается к входу? (т.е.: перемещения мыши, клавиши, нажатые и так далее)
Я не могу сказать вам, какие именно события слушает CommandManager
. Однако я могу сказать, что вам следует быть осторожными при использовании CommandManager
в связи с асинхронными операциями. У меня возникла следующая проблема при использовании CommandManager
в реализации ICommand
:
У меня была кнопка, привязанная к ICommand
, которая запускала асинхронную операцию, увеличивающую значение. Теперь кнопка/ICommand
должна быть отключена (т.е. ее метод CanExecute()
должен возвращать false
), если значение достигло определенного предела. Проблема заключалась в следующем: CommandManager
вызывал мой метод CanExecute()
сразу после нажатия на кнопку и запуска асинхронной операции. Эта асинхронная операция длилась недолго, но достаточно долго, чтобы получить результат после проверки CommandManager
, так что проверка лимита в CanExecute()
была выполнена с использованием старого значения. Таким образом, кнопка оставалась включенной, хотя лимит был достигнут. Забавно, что после щелчка в любом месте пользовательского интерфейса кнопка отключалась, потому что CommandManager
проверял ICommand
еще раз, и теперь новое значение сверялось с лимитом.
На самом деле, я думаю, что CommandManager
ждал около 50 мс после нажатия кнопки, пока не выполнил проверку ICommand
, но я не совсем уверен в этом.
Моим решением было заставить CommandManager
снова проверить ICommand
, вызвав CommandManager.InvalidateRequerySuggested
метод в моей ViewModel сразу после получения результата асинхронной операции.
Обновление: Обратите внимание, что этот метод должен быть вызван в потоке UI, иначе он не будет иметь никакого эффекта! (Спасибо midspace за этот комментарий)