Подтвердить что ты не робот

Как работает CommandManager.RequeryS Suggest?

MSDN только утверждает, что

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

В этом случае .NET Reference Source является вашим другом. Хотя он плохо комментировал, вы все равно можете получить некоторые идеи о внутренней обработке.

Во внутреннем классе CommandDevice вы найдете метод PostProcessInput, который вызывает InvalidateRequerySposed. Имя этого метода позволяет предположить, что метод InvalidateRequerySposed вызывается для каждого входного события. Я уверен, что есть дальнейшая обработка и фильтрация, так что ваш метод CanExecute на самом деле не вызывается при каждом вызове InvalidateRequerySposed.