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

Какова фактическая задача CanExecuteChanged и CommandManager.RequerySposed?

Я получил следующий код от Josh Smith MVVM учебник.

Может ли кто-нибудь дать краткое описание того, что на самом деле делает этот код?

public event EventHandler CanExecuteChanged
{
    add { CommandManager.RequerySuggested += value; }
    remove { CommandManager.RequerySuggested -= value; }     
}

Я не могу понять две вещи:

  • Что делает событие CanExecuteChanged?
  • Что делает CommandManager.RequerySuggested?

Вышеприведенный код из RelayCommand Class из здесь.

4b9b3361

Ответ 1

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

Таким образом, в сущности, этот бит кода гарантирует, что всякий раз, когда менеджер команд думает, что возможность выполнения команды изменилась, команда поднимет CanExecuteChanged, даже если она фактически не изменилась.

Мне действительно не нравится этот подход к внедрению ICommand.CanExecuteChanged - он чувствует себя ленивым и не совсем надежным. Я предпочитаю гораздо более тонкий подход, когда команда предоставляет метод (например, RaiseCanExecuteChanged()), который вы можете вызвать для повышения CanExecuteChanged, затем вы вызываете это в соответствующие моменты из своей модели просмотра.

Например, если у вас есть команда, которая удаляет выбранного клиента, у него будет обработчик CanExecute(), который возвращает true, только если выбран клиент. Поэтому вы вызываете RaiseCanExecuteChanged всякий раз, когда изменяется выбранный клиент.

Ответ 2

  • RoutedCommands может автоматически уведомлять, изменились ли их CanExecute, так как мы реализуем ICommand здесь, о которых система WPF не знает, мы связываем их с событием CommandManager RequerySuggested.
  • Теперь это событие часто вызывается системой WPF при изменении фокуса, любой элемент управления редактируется и т.д. Следовательно, в свою очередь CanExecuteChanged возникает. Когда ваша кнопка прослушивает это событие, она повторно запустит CanExecute, чтобы узнать последний статус.

Вот статья, которая может представлять интерес.