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