Как и в разделе, посвященном проверке достоверности, можете продолжить работу с тем же проектом или создать новый проект и скопировать в него весь код из предыдущего проекта. Вы создадите новый проект по имени WpfCommands. В случае работы с проектом из предыдущего раздела обращайте внимание на пространства имен в примерах кода и корректируйте их по мере необходимости.
В главе 25 объяснялось, что команды являются неотъемлемой частью WPF. Команды могут привязываться к элементам управления WPF (таким как Button и MenuItem) для обработки пользовательских событий, подобных щелчку. Вместо создания обработчика события напрямую и помещения его кода в файл отделенного кода при возникновении события выполняется метод Execute() команды. Метод CanExecute() используется для включения или отключения элемента управления на основе специального кода. В дополнение к встроенным командам, которые применялись в главе 25, можно создавать собственные команды, реализуя интерфейс ICommand. Когда вместо обработчиков событий используются команды, появляются преимущества инкапсуляции кода приложения, а также автоматического включения и отключения элементов управления с помощью бизнес-логики.
Реализация интерфейса ICommand
Как было показано в главе 25, интерфейс ICommand определен следующим образом:
public interface ICommand
{
event EventHandler CanExecuteChanged;
bool CanExecute(object parameter);
void Execute(object parameter);
}
Добавление класса ChangeColorCommand
Обработчики событий для элементов управления Button вы замените командами, начав с кнопки Change Color. Создайте в проекте новую папку по имени Cmds. Добавьте в нее новый файл класса ChangeColorCornmand.cs. Сделайте класс открытым и реализующим интерфейс ICommand. Добавьте приведенные ниже операторы using (первый может варьироваться в зависимости от того, создавался ли новый проект для данного примера):
using WpfCommands.Models;
using System.Windows.Input;
Код класса должен выглядеть примерно так:
public class ChangeColorCommand : ICommand
{
public bool CanExecute(object parameter)
{
throw new NotImplementedException();
}
public void Execute(object parameter)
{
throw new NotImplementedException();
}
public event EventHandler CanExecuteChanged;
}
Если метод CanExecute() возвращает true, то привязанные элементы управления будут включенными, а если false, тогда они будут отключенными. Если элемент управления включен (CanExecute() возвращает true)и на нем совершается щелчок, то запустится метод Execute(). Параметры, передаваемые обоим методам, поступают из пользовательского интерфейса и основаны на свойстве CommandParameter, устанавливаемом в конструкциях привязки. Событие CanExecuteChanged предусмотрено в системе привязки и уведомлений для информирования пользовательского интерфейса о том, что результат, возвращаемый методом CanExecute(), изменился (почти как событие PropertyChanged).
В текущем примере кнопка Change Color должна работать, только если параметр отличается от null ипринадлежит типу Car. Модифицируйте метод CanExecute() следующим образом:
public bool CanExecute(object parameter)
=> (parameter as Car) != null;
Значение параметра для метода Execute() будет таким же, как и для метода CanExecute(). Поскольку метод Execute() может выполняться лишь в случае, если object имеет тип Car, аргумент потребуется привести к типу Car и затем обновить значение цвета:
public void Execute(object parameter)
{
((Car)parameter).Color="Pink";
}
Присоединение команды к CommandManager
Финальное обновление класса команды связано с присоединением команды к диспетчеру команд (CommandManager). Метод CanExecute() запускается при загрузке окна в первый раз и затем в ситуации, когда диспетчер команд инструктирует его о необходимости перезапуска. Каждый класс команды должен быть присоединен к диспетчеру команд, для чего нужно модифицировать код, относящийся к событию CanExecuteChanged:
public event EventHandler CanExecuteChanged
{
add => CommandManager.RequerySuggested += value;