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

на главную - закладки

Жанры

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

Изменение класса ChangeColorCommand

Финальным шагом будет обновление класса

ChangeColorCommand
, чтобы он стал унаследованным от
CommandBase
. Замените интерфейс
ICommand
классом
CommandBase
, добавьте к обоим методам ключевое слово
override
и удалите код события
CanExecuteChanged
. Все оказалось действительно настолько просто! Вот как выглядит новый код:

public class ChangeColorCommand : CommandBase

{

public override bool CanExecute(object parameter)

=> parameter is Car;

public override void Execute(object parameter)

{

((Car)parameter).Color = "Pink";

}

}

Объекты RelayCommand

Еще

одной реализацией паттерна "Команда" (Command) в WPF является
RelayCommand
. Вместо создания нового класса, представляющего каждую команду, данный паттерн применяет делегаты для реализации интерфейса
ICommand
. Реализация легковесна в том, что каждая команда не имеет собственного класса. Объекты
RelayCommand
обычно используются, когда нет необходимости в многократном применении реализации команды.

Создание базового класса RelayCommand

Как правило, объекты

RelayCommand
реализуются в двух классах. Базовый класс
RelayCommand
используется при отсутствии каких-либо параметров для методов
CanExecute
и
Execute
, а класс
RelayCommand<T>
применяется, когда требуется параметр. Начните с базового класса
RelayCommand
, который задействует класс
CommandBase
. Добавьте в папку
Cmds
новый файл класса по имени
RelayCommand.cs
. Сделайте его открытым и укажите
CommandBase
в качестве базового класса. Добавьте две переменные уровня класса для хранения делегатов
Execute
и
CanExecute
:

private readonly Action _execute;

private readonly Func<bool> _canExecute;

Создайте три конструктора. Первый — стандартный конструктор (необходимый для производного класса

RelayCommand<T>
), второй — конструктор, который принимает параметр
Action
, и третий — конструктор, принимающий параметры
Action
и
Func
:

public RelayCommand{}

public RelayCommand(Action execute) : this(execute, null) { }

public RelayCommand(Action execute, Func<bool> canExecute)

{

_execute = execute

?? throw new ArgumentNullException(nameof(execute));

_canExecute = canExecute;

}

Наконец, реализуйте переопределенные версии

CanExecute
и
Execute
. Метод
CanExecute
возвращает
true
, если параметр
Func
равен
null
; если же параметр
Func
не
null
, то он выполняется и возвращается
true
. Метод
Execute
выполняет параметр типа
Action
.

public override bool CanExecute(object parameter)

=> _canExecute == null || _canExecute;

public override void Execute(object parameter) { _execute; }

Создание

класса RelayCommand<T>

Добавьте в папку

Cmds
новый файл класса по имени
RelayCommandT.cs
. Класс
RelayCommandT
является почти полной копией базового класса, исключая тот факт, что все делегаты принимают параметр. Сделайте класс открытым и обобщенным, а также унаследованным от базового класса
RelayCommand
:

public class RelayCommand<T> : RelayCommand

Добавьте две переменные уровня класса для хранения делегатов

Execute
и
CanExecute
:

private readonly Action<T> _execute;

private readonly Func<T, bool> _canExecute;

Создайте два конструктора. Первый из них принимает параметр

Action<T>
, а второй — параметры
Action<T>
и
Func<T,bool>
:

public RelayCommand(Action<T> execute):this(execute, null) {}

public RelayCommand(

Action<T> execute, Func<T, bool> canExecute)

{

_execute = execute

?? throw new ArgumentNullException(nameof(execute));

_canExecute = canExecute;

}

Наконец, реализуйте переопределенные версии

CanExecute
и
Execute
. Метод
CanExecute
возвращает
true
, если
Func
равно
null
, а иначе выполняет
Func
и возвращает
true
. Метод
Execute
выполняет параметр типа
Action
.

public override bool CanExecute(object parameter)

=> _canExecute == null || _canExecute((T)parameter);

public override void Execute(object parameter)

{ _execute((T)parameter); }

Изменение файла MainWindow.xaml.cs

Когда используются объекты

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

Добавьте новую закрытую переменную типа

RelayCommand<Car>
и открытое свойство по имени
DeleteCarCmd
;

private RelayCommand<Car> _deleteCarCommand = null;

public RelayCommand<Car> DeleteCarCmd

=> _deleteCarCommand ??=

new RelayCommand<Car>(DeleteCar,CanDeleteCar));

Также потребуется создать методы

DeleteCar
и
CanDeleteCar
:

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

Стеллар. Трибут

Прокофьев Роман Юрьевич
2. Стеллар
Фантастика:
боевая фантастика
рпг
8.75
рейтинг книги
Стеллар. Трибут

Его огонь горит для меня. Том 2

Муратова Ульяна
2. Мир Карастели
Фантастика:
юмористическая фантастика
5.40
рейтинг книги
Его огонь горит для меня. Том 2

На границе империй. Том 9. Часть 4

INDIGO
17. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 4

Наследник

Кулаков Алексей Иванович
1. Рюрикова кровь
Фантастика:
научная фантастика
попаданцы
альтернативная история
8.69
рейтинг книги
Наследник

Совершенно несекретно

Иванов Дмитрий
15. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Совершенно несекретно

Ваше Сиятельство 2

Моури Эрли
2. Ваше Сиятельство
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Ваше Сиятельство 2

Прометей: каменный век II

Рави Ивар
2. Прометей
Фантастика:
альтернативная история
7.40
рейтинг книги
Прометей: каменный век II

Единственная для темного эльфа 3

Мазарин Ан
3. Мир Верея. Драконья невеста
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Единственная для темного эльфа 3

Жандарм

Семин Никита
1. Жандарм
Фантастика:
попаданцы
альтернативная история
аниме
4.11
рейтинг книги
Жандарм

Долгий путь домой

Русич Антон
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
6.20
рейтинг книги
Долгий путь домой

Прогрессор поневоле

Распопов Дмитрий Викторович
2. Фараон
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Прогрессор поневоле

Наследие Маозари 6

Панежин Евгений
6. Наследие Маозари
Фантастика:
попаданцы
постапокалипсис
рпг
фэнтези
эпическая фантастика
5.00
рейтинг книги
Наследие Маозари 6

Я еще не барон

Дрейк Сириус
1. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я еще не барон

Лолита

Набоков Владимир Владимирович
Проза:
классическая проза
современная проза
8.05
рейтинг книги
Лолита