Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Троелсен Эндрю, "Язык программирования C#9 и платформа .NET5" бесплатно, без регистрации.
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.csCmdsCommandBase.csusingSystem.Windows.InputCommandBaseICommandExecute()CanExecute()CanExecuteChangedChangeColorCommandusing 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
Добавьте в папку
CmdsAddCarCommand.csCommandBaseusingusing System.Collections.ObjectModel;using System.Linq;using WpfCommands.Models;Ожидается, что параметр должен иметь тип
ObservableCollection<Car>CanExecute()ObservableCollection<Car>Execute()CarClickpublic 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
Добавьте открытое свойство типа
ICommandAddCarCmdAddCarCommandnullprivate ICommand _addCarCommand = null;public ICommand AddCarCmd => _addCarCommand ??= new AddCarCommand());Изменение файла MainWindow.xaml
Модифицируйте разметку XAML, удалив атрибут
ClickCommandCommandParameterAddCarCommandcboCars<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}"/>