Выбери любимый жанр
Мир литературы

Выбрать книгу по жанру

Фантастика и фэнтези

Детективы и триллеры

Проза

Любовные романы

Приключения

Детские

Поэзия и драматургия

Старинная литература

Научно-образовательная

Компьютеры и интернет

Справочная литература

Документальная литература

Религия и духовность

Юмор

Дом и семья

Деловая литература

Жанр не определен

Техника

Прочее

Драматургия

Фольклор

Военное дело

Последние комментарии
Сергей2018-11-27
Не книга, а полная чушь! Хорошо, что чит
К книге
Lynxlynx2018-11-27
Читать такие книги полезно для расширени
К книге
Leonika2016-11-07
Есть аналоги и покрасивее...
К книге
Важник2018-11-27
Какое-то смутное ощущение после прочтени
К книге
Aida2018-11-27
Не книга, а полная чушь! Хорошо, что чит
К книге

Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю - Страница 571


571
Изменить размер шрифта:

    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
.

(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})

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
. Ниже показана полная разметка XAML для кнопки:

<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}"/>