Читаем Язык программирования 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, поэтому предусмотрите в методе CanExecute соответствующую проверку. Если параметр относится к типу ObservableCollection, тогда метод Execute должен добавить дополнительный объект Car подобно обработчику события Click.


public class AddCarCommand :CommandBase

{

  public override bool CanExecute(object parameter)

    => parameter is ObservableCollection;

  public override void Execute(object parameter)

  {

    if (parameter is not ObservableCollection 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 для кнопки:


  Command="{Binding Path=AddCarCmd,

  RelativeSource={RelativeSource Mode=FindAncestor,

  AncestorType={x:Type Window}}}"

  CommandParameter="{Binding ElementName=cboCars, Path=ItemsSource}"/>


Перейти на страницу:

Похожие книги

Программирование. Принципы и практика использования C++ Исправленное издание
Программирование. Принципы и практика использования C++ Исправленное издание

Специальное издание самой читаемой и содержащей наиболее достоверные сведения книги по C++. Книга написана Бьярне Страуструпом — автором языка программирования C++ — и является каноническим изложением возможностей этого языка. Помимо подробного описания собственно языка, на страницах книги вы найдете доказавшие свою эффективность подходы к решению разнообразных задач проектирования и программирования. Многочисленные примеры демонстрируют как хороший стиль программирования на С-совместимом ядре C++, так и современный -ориентированный подход к созданию программных продуктов. Третье издание бестселлера было существенно переработано автором. Результатом этой переработки стала большая доступность книги для новичков. В то же время, текст обогатился сведениями и методиками программирования, которые могут оказаться полезными даже для многоопытных специалистов по C++. Не обойдены вниманием и нововведения языка: стандартная библиотека шаблонов (STL), пространства имен (namespaces), механизм идентификации типов во время выполнения (RTTI), явные приведения типов (cast-операторы) и другие. Настоящее специальное издание отличается от третьего добавлением двух новых приложений (посвященных локализации и безопасной обработке исключений средствами стандартной библиотеки), довольно многочисленными уточнениями в остальном тексте, а также исправлением множества опечаток. Книга адресована программистам, использующим в своей повседневной работе C++. Она также будет полезна преподавателям, студентам и всем, кто хочет ознакомиться с описанием языка «из первых рук».

Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов

Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT
97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Нил Форд , Билл де Ора , Майкл Хайгард

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT