Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Троелсен Эндрю, "Язык программирования 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;
}