remove => CommandManager.RequerySuggested -= value;

}

<p id="AutBody_Root1290"><strong>Изменение файла MainWindow.xaml.cs</strong></p>

Следующее изменение связано с созданием экземпляра класса ChangeColorCommand, к которому может иметь доступ элемент управления Button. В настоящий момент вы будете делать это в файле отделенного кода для MainWindow (позже в главе код переместится в модель представления). Откройте файл MainWindow.xaml.cs и удалите обработчик события Click для кнопки Change Color. Поместите в начало файла следующие операторы using (пространство имен может варьироваться в зависимости от того, работаете вы с предыдущим проектом или начали новый):

using WpfCommands.Cmds;

using System.Windows.Input;

Добавьте открытое свойство по имени ChangeColorCmd типа ICommand с поддерживающим полем. В теле выражения для свойства возвратите значение поддерживающего поля (создавая экземпляр ChangeColorCommand, если поддерживающее поле равно null):

private ICommand _changeColorCommand = null;

public ICommand ChangeColorCmd

  => _changeColorCommand ??= new ChangeColorCommand());

<p id="AutBody_Root1291"><strong>Изменение файла MainWindow.xaml</strong></p>

Как было показано в главе 25, элементы управления WPF, реагирующие на щелчки (вроде Button), имеют свойство Command, которое позволяет назначать элементу управления объект команды. Для начала присоедините объект команды, созданный в файле отделенного кода, к кнопке btnChangeColor. Поскольку свойство для команды находится в классе MainWindow, с помощью синтаксиса привязки RelativeSource получается окно, содержащее необходимую кнопку:

Command="{Binding Path=ChangeColorCmd,

  RelativeSource={RelativeSource Mode=FindAncestor,

    AncestorType={x:Type Window}}}"

Кнопка также нуждается в передаче объекта Car в качестве параметра для методов CanExecute() и Execute(), что делается через свойство CommandParameter. Установите свойство Path для CommandParameter в свойство SelectedItem элемента ComboBox по имени cboCars:

CommandParameter="{Binding ElementName=cboCars, Path=SelectedItem}"

Вот завершенная разметка для кнопки:

    Padding="4, 2" Command="{Binding Path=ChangeColorCmd,

    RelativeSource={RelativeSource Mode=FindAncestor,

                    AncestorType={x:Type Window}}}"

    CommandParameter="{Binding ElementName=cboCars, Path=SelectedItem}"/>

<p id="AutBody_Root1292"><strong>Тестирование приложения</strong></p>

Запустите приложение. Кнопка Change Color не будет доступной (рис. 28.8), т.к. автомобиль еще не выбран.

Теперь выберите автомобиль; кнопка Change Color становится доступной, а щелчок на ней обеспечивает изменение цвета, как и ожидалось!

<p id="AutBody_Root1293"><strong>Создание класса CommandBase</strong></p>

Если распространить такой шаблон на AddCarCommand.cs, то итогом стал бы код, повторяющийся среди классов. Это хороший знак о том, что необходим базовый класс. Создайте внутри папки Cmds новый файл класса по имени CommandBase.cs и добавьте оператор using для пространства имен System.Windows.Input. Сделайте класс CommandBase открытым и реализующим интерфейс ICommand. Превратите класс и методы Execute() и CanExecute() в абстрактные. Наконец, добавьте обновление в событие CanExecuteChanged из класса ChangeColorCommand. Ниже показана полная реализация:

using System;

using System.Windows.Input;

namespace WpfCommands.Cmds

{

  public abstract class CommandBase : ICommand

  {

    public abstract bool CanExecute(object parameter);

    public abstract void Execute(object parameter);

    public event EventHandler CanExecuteChanged

    {

      add => CommandManager.RequerySuggested += value;

      remove => CommandManager.RequerySuggested -= value;

    }

  }

}

<p id="AutBody_Root1294"><strong>Добавление класса AddCarCommand</strong></p>
Перейти на страницу:

Похожие книги