Чтение онлайн

на главную

Жанры

Язык программирования C#9 и платформа .NET5
Шрифт:

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

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

<Button x:Name="btnChangeColor" Content="Change Color" Margin="5,0,5,0"

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

RelativeSource={RelativeSource Mode=FindAncestor,

AncestorType={x:Type Window}}}"

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

Тестирование

приложения

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

Теперь выберите автомобиль; кнопка 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<Car>
, поэтому предусмотрите в методе
CanExecute
соответствующую проверку. Если параметр относится к типу
ObservableCollection<Car>
, тогда метод
Execute
должен добавить дополнительный объект
Car
подобно обработчику события
Click
.

public class AddCarCommand :CommandBase

{

public override bool CanExecute(object parameter)

=> parameter is ObservableCollection<Car>;

public override void Execute(object parameter)

{

if (parameter is not ObservableCollection<Car> cars)

{

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 для кнопки:

<Button x:Name="btnAddCar" Content="Add Car" Margin="5,0,5,0" Padding="4, 2"

Command="{Binding Path=AddCarCmd,

RelativeSource={RelativeSource Mode=FindAncestor,

AncestorType={x:Type Window}}}"

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

В результате появляется возможность добавления автомобилей и обновления их цветов (пока с весьма ограниченной функциональностью) с помощью многократно используемого кода, содержащегося в автономных классах.

Поделиться:
Популярные книги

Совок 2

Агарев Вадим
2. Совок
Фантастика:
альтернативная история
7.61
рейтинг книги
Совок 2

Сама себе хозяйка

Красовская Марианна
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Сама себе хозяйка

СД. Том 17

Клеванский Кирилл Сергеевич
17. Сердце дракона
Фантастика:
боевая фантастика
6.70
рейтинг книги
СД. Том 17

Первый пользователь. Книга 3

Сластин Артем
3. Первый пользователь
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Первый пользователь. Книга 3

Хочу тебя навсегда

Джокер Ольга
2. Люби меня
Любовные романы:
современные любовные романы
5.25
рейтинг книги
Хочу тебя навсегда

Адъютант

Демиров Леонид
2. Мания крафта
Фантастика:
фэнтези
6.43
рейтинг книги
Адъютант

Убивать, чтобы жить

Бор Жорж
1. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать, чтобы жить

Измена. Испорченная свадьба

Данич Дина
Любовные романы:
современные любовные романы
короткие любовные романы
5.00
рейтинг книги
Измена. Испорченная свадьба

Я – Орк. Том 3

Лисицин Евгений
3. Я — Орк
Фантастика:
юмористическое фэнтези
попаданцы
5.00
рейтинг книги
Я – Орк. Том 3

Крестоносец

Ланцов Михаил Алексеевич
7. Помещик
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Крестоносец

Совок – 3

Агарев Вадим
3. Совок
Фантастика:
фэнтези
детективная фантастика
попаданцы
7.92
рейтинг книги
Совок – 3

С Д. Том 16

Клеванский Кирилл Сергеевич
16. Сердце дракона
Фантастика:
боевая фантастика
6.94
рейтинг книги
С Д. Том 16

Назад в СССР: 1986 Книга 5

Гаусс Максим
5. Спасти ЧАЭС
Фантастика:
попаданцы
альтернативная история
5.75
рейтинг книги
Назад в СССР: 1986 Книга 5

Ретроградный меркурий

Рам Янка
4. Серьёзные мальчики в форме
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Ретроградный меркурий