Язык программирования 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.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
<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}"/>