Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Троелсен Эндрю, "Язык программирования C#9 и платформа .NET5" бесплатно, без регистрации.
В результате появляется возможность добавления автомобилей и обновления их цветов (пока с весьма ограниченной функциональностью) с помощью многократно используемого кода, содержащегося в автономных классах.
Изменение класса ChangeColorCommand
Финальным шагом будет обновление класса
ChangeColorCommandCommandBaseICommandCommandBaseoverrideCanExecuteChangedpublic 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 является
RelayCommandICommandRelayCommandСоздание базового класса RelayCommand
Как правило, объекты
RelayCommandRelayCommandCanExecute()Execute()RelayCommand<T>RelayCommandCommandBaseCmdsRelayCommand.csCommandBaseExecute()CanExecute()private readonly Action _execute;private readonly Func<bool> _canExecute;Создайте три конструктора. Первый — стандартный конструктор (необходимый для производного класса
RelayCommand<T>ActionActionFuncpublic 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()trueFuncnullFuncnulltrueExecute()Actionpublic override bool CanExecute(object parameter) => _canExecute == null || _canExecute();public override void Execute(object parameter) { _execute(); }Создание класса RelayCommand<T>
Добавьте в папку
CmdsRelayCommandT.csRelayCommandTRelayCommandpublic 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;}