CanExecuteChanged
уведомляет любые источники команд (например, Button
или MenuItem
), связанные с тем ICommand
, что значение, возвращаемое CanExecute
, изменилось. Источники команд заботятся об этом, потому что они обычно должны соответствующим образом обновить свой статус (например, Button
отключится, если CanExecute()
вернет false
).
- Событие
CommandManager.RequerySuggested
возникает всякий раз, когда CommandManager
думает, что что-то изменилось, что повлияет на возможность выполнения команд. Это может быть изменение фокуса, например. Оказывается, это событие часто срабатывает.
Таким образом, в сущности, этот бит кода обеспечивает то, что всякий раз, когда менеджер команд считает, что возможность выполнения команды изменилась, команда вызовет CanExecuteChanged
, даже если она на самом деле не изменилась.
Мне на самом деле не нравится этот подход к реализации ICommand.CanExecuteChanged
- он ленивый и не совсем надежный. Я предпочитаю гораздо более детальный подход, когда команда предоставляет метод (например, RaiseCanExecuteChanged()
), который вы можете вызвать для поднятия CanExecuteChanged
, а затем вызываете его в подходящее время из вашей модели представления.
Например, если у вас есть команда, которая удаляет текущего выбранного клиента, он будет иметь обработчик CanExecute()
, который возвращает true
, только если выбран клиент. Поэтому вы будете звонить RaiseCanExecuteChanged
всякий раз, когда выбранный клиент меняется.