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