Как и в разделе, посвященном проверке достоверности, можете продолжить работу с тем же проектом или создать новый проект и скопировать в него весь код из предыдущего проекта. Вы создадите новый проект по имени 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;