Как делает CommandManager. Работа RequerySuggested?

MSDN только указывает это

Происходит, когда CommandManager обнаруживает условия, которые могли бы изменить способность команды выполниться.

Однако я, может казаться, не нахожу трассировок того, как это работает, о чем я должен знать / избегают и т.д... Это просто прислушивается к входу? (т.е.: перемещения мыши, клавиши, нажатые и так далее)

37
задан Hakan Fıstık 29 December 2018 в 12:27
поделиться

1 ответ

Я не могу сказать вам, какие именно события слушает CommandManager. Однако я могу сказать, что вам следует быть осторожными при использовании CommandManager в связи с асинхронными операциями. У меня возникла следующая проблема при использовании CommandManager в реализации ICommand:

У меня была кнопка, привязанная к ICommand, которая запускала асинхронную операцию, увеличивающую значение. Теперь кнопка/ICommand должна быть отключена (т.е. ее метод CanExecute() должен возвращать false), если значение достигло определенного предела. Проблема заключалась в следующем: CommandManager вызывал мой метод CanExecute() сразу после нажатия на кнопку и запуска асинхронной операции. Эта асинхронная операция длилась недолго, но достаточно долго, чтобы получить результат после проверки CommandManager, так что проверка лимита в CanExecute() была выполнена с использованием старого значения. Таким образом, кнопка оставалась включенной, хотя лимит был достигнут. Забавно, что после щелчка в любом месте пользовательского интерфейса кнопка отключалась, потому что CommandManager проверял ICommand еще раз, и теперь новое значение сверялось с лимитом. На самом деле, я думаю, что CommandManager ждал около 50 мс после нажатия кнопки, пока не выполнил проверку ICommand, но я не совсем уверен в этом.

Моим решением было заставить CommandManager снова проверить ICommand, вызвав CommandManager.InvalidateRequerySuggested метод в моей ViewModel сразу после получения результата асинхронной операции.
Обновление: Обратите внимание, что этот метод должен быть вызван в потоке UI, иначе он не будет иметь никакого эффекта! (Спасибо midspace за этот комментарий)

47
ответ дан 27 November 2019 в 04:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: