Когда WPF решает запросить команды, могут ли они выполняться?

Когда WPF запрашивает команды, могут ли они выполняться? Отладчик сообщает, что это происходит довольно часто. Но каков точный набор условий?


person Pavel Voronin    schedule 12.12.2012    source источник
comment
Я думаю, это зависит от типа команды. RelayCommand обычно запрашивает CanExecuteChanged() в любое время при изменении любого свойства (я думаю, запустив CommandManager.InvalidateRequerySuggested каждый раз, когда изменяется свойство), в то время как DelegateCommand этого не происходит, и вам нужно вручную поднимать CanExecuteChanged, когда свойство, от которого оно зависит, изменяется. Кроме того, все команды переоцениваются, когда они связаны, поэтому что-то вроде скрытия, а затем отображения окна часто вызывает повторный запрос.   -  person Rachel    schedule 12.12.2012
comment
Хорошая тема на эту тему здесь:robburke. нетто/2008/04/   -  person Cornel Marian    schedule 24.10.2013
comment
вот несколько вызовов InvalidateRequerySuggested()   -  person Johan Larsson    schedule 15.12.2014
comment
Рабочая ссылка @CornelMarian: robburke.net/wpf-command- шаблон-когда-это-запрос-может-выполнить   -  person g t    schedule 24.05.2019


Ответы (1)


Версия TL; DR заключается в том, что методы CanExecute вызываются, когда в окне происходят определенные события ввода. В основном это события клавиатуры и мыши.

Таким образом, каждый раз, когда кто-то щелкает или нажимает клавишу, ВСЕ команды становятся недействительными с помощью CommandManager (путем создания файла CommandManager.RequerySuggested). Вот почему так важно поддерживать скорость методов CanExecute.

Также можно справиться с этим самостоятельно, создав пользовательскую реализацию ICommand, которая не использует CommandManager для события CanExecuteChanged.

person Troels Larsen    schedule 30.03.2015