Padding="4, 2" Command="{Binding Path=ChangeColorCmd,
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type Window}}}"
CommandParameter="{Binding ElementName=cboCars, Path=SelectedItem}"/>
Тестирование приложения
Запустите приложение. Кнопка Change Color
Теперь выберите автомобиль; кнопка Change Color становится доступной, а щелчок на ней обеспечивает изменение цвета, как и ожидалось!
Создание класса CommandBase
Если распространить такой шаблон на 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;
}
}
}
Добавление класса AddCarCommand
Добавьте в папку Cmds
новый файл класса по имени AddCarCommand.cs
. Сделайте класс открытым и укажите CommandBase
в качестве базового класса. Поместите в начало файла следующие операторы using
:
using System.Collections.ObjectModel;
using System.Linq;
using WpfCommands.Models;
Ожидается, что параметр должен иметь тип ObservableCollection
, поэтому предусмотрите в методе CanExecute
соответствующую проверку. Если параметр относится к типу ObservableCollection
, тогда метод Execute
должен добавить дополнительный объект Car
подобно обработчику события Click
.
public class AddCarCommand :CommandBase
{
public override bool CanExecute(object parameter)
=> parameter is ObservableCollection
public override void Execute(object parameter)
{
if (parameter is not ObservableCollection
{
return;
}
var maxCount = cars.Max(x => x.Id);
cars.Add(new Car
{
Id = ++maxCount,
Color = "Yellow",
Make = "VW",
PetName = "Birdie"
});
}
}
Изменение файла MainWindow.xaml.cs
Добавьте открытое свойство типа ICommand
по имени AddCarCmd
с поддерживающим полем. В теле выражения для свойства возвратите значение поддерживающего поля (создавая экземпляр AddCarCommand
, если поддерживающее поле равно null
):
private ICommand _addCarCommand = null;
public ICommand AddCarCmd
=> _addCarCommand ??= new AddCarCommand);
Изменение файла MainWindow.xaml
Модифицируйте разметку XAML, удалив атрибут Click
и добавив атрибуты Command
и CommandParameter
. Объект AddCarCommand
будет получать список автомобилей из поля со списком cboCars
. Ниже показана полная разметка XAML для кнопки:
Command="{Binding Path=AddCarCmd,
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type Window}}}"
CommandParameter="{Binding ElementName=cboCars, Path=ItemsSource}"/>
Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT