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;
remove => CommandManager.RequerySuggested -= value;
}
Изменение файла MainWindow.xaml.cs
Следующее изменение связано с созданием экземпляра класса 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);
Изменение файла MainWindow.xaml
Как было показано в главе 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}"
Вот завершенная разметка для кнопки:
Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT