Чтение онлайн

на главную

Жанры

Язык программирования C#9 и платформа .NET5
Шрифт:

Реализация интерфейса ICommand

Как было показано в главе 25, интерфейс

ICommand
определен следующим образом:

public interface ICommand

{

event EventHandler CanExecuteChanged;

bool CanExecute(object parameter);

void Execute(object parameter);

}

Добавление класса ChangeColorCommand

Обработчики событий для элементов управления

Button
вы замените командами, начав с кнопки Change Color. Создайте в проекте новую папку по имени
Cmds
. Добавьте в нее новый файл класса
ChangeColorCornmand.cs
. Сделайте класс открытым и реализующим интерфейс
ICommand
. Добавьте приведенные ниже операторы
using
(первый может варьироваться в зависимости от того, создавался ли новый проект для данного примера):

using WpfCommands.Models;

using System.Windows.Input;

Код класса должен выглядеть примерно так:

public class ChangeColorCommand : ICommand

{

public bool CanExecute(object parameter)

{

throw new NotImplementedException;

}

public void Execute(object parameter)

{

throw new NotImplementedException;

}

public event EventHandler CanExecuteChanged;

}

Если метод

CanExecute
возвращает
true
, то привязанные элементы управления будут включенными, а если
false
, тогда они будут отключенными. Если элемент управления включен (
CanExecute
возвращает
true
)и на нем совершается щелчок, то запустится метод
Execute
. Параметры, передаваемые обоим методам, поступают из пользовательского интерфейса и основаны на свойстве
CommandParameter
, устанавливаемом в конструкциях привязки. Событие
CanExecuteChanged
предусмотрено в системе привязки и уведомлений для информирования пользовательского интерфейса о том, что результат, возвращаемый методом
CanExecute
, изменился (почти как событие
PropertyChanged
).

В текущем примере кнопка Change Color должна работать, только если параметр отличается от

null
ипринадлежит типу
Car
. Модифицируйте метод
CanExecute
следующим образом:

public bool CanExecute(object parameter)

=> (parameter as Car) != null;

Значение параметра для метода

Execute
будет таким же, как и для метода
CanExecute
. Поскольку метод
Execute
может выполняться лишь в случае, если
object
имеет тип
Car
, аргумент потребуется привести к типу
Car
и затем обновить значение цвета:

public void Execute(object parameter)

{

((Car)parameter).Color="Pink";

}

Присоединение команды

к CommandManager

Финальное обновление класса команды связано с присоединением команды к диспетчеру команд (

CommandManager
). Метод
CanExecute
запускается при загрузке окна в первый раз и затем в ситуации, когда диспетчер команд инструктирует его о необходимости перезапуска. Каждый класс команды должен быть присоединен к диспетчеру команд, для чего нужно модифицировать код, относящийся к событию
CanExecuteChanged
:

public event EventHandler CanExecuteChanged

{

add => CommandManager.RequerySuggested += value;

remove => CommandManager.RequerySuggested -= value;

}

Изменение файла MainWindow.xaml.cs

Следующее изменение связано с созданием экземпляра класса

ChangeColorCommand
, к которому может иметь доступ элемент управления
Button
. В настоящий момент вы будете делать это в файле отделенного кода для
MainWindow
(позже в главе код переместится в модель представления). Откройте файл
MainWindow.xaml.cs
и удалите обработчик события
Click
для кнопки Change Color. Поместите в начало файла следующие операторы
using
(пространство имен может варьироваться в зависимости от того, работаете вы с предыдущим проектом или начали новый):

using WpfCommands.Cmds;

using System.Windows.Input;

Добавьте открытое свойство по имени

ChangeColorCmd
типа
ICommand
с поддерживающим полем. В теле выражения для свойства возвратите значение поддерживающего поля (создавая экземпляр
ChangeColorCommand
, если поддерживающее поле равно
null
):

private ICommand _changeColorCommand = null;

public ICommand ChangeColorCmd

=> _changeColorCommand ??= new ChangeColorCommand);

Изменение файла MainWindow.xaml

Как было показано в главе 25, элементы управления WPF, реагирующие на щелчки (вроде

Button
), имеют свойство
Command
, которое позволяет назначать элементу управления объект команды. Для начала присоедините объект команды, созданный в файле отделенного кода, к кнопке
btnChangeColor
. Поскольку свойство для команды находится в классе
MainWindow
, с помощью синтаксиса привязки
RelativeSource
получается окно, содержащее необходимую кнопку:

Command="{Binding Path=ChangeColorCmd,

RelativeSource={RelativeSource Mode=FindAncestor,

AncestorType={x:Type Window}}}"

Кнопка также нуждается в передаче объекта

Car
в качестве параметра для методов
CanExecute
и
Execute
, что делается через свойство
CommandParameter
. Установите свойство
Path
для
CommandParameter
в свойство
SelectedItem
элемента
ComboBox
по имени
cboCars
:

Поделиться:
Популярные книги

Средневековая история. Тетралогия

Гончарова Галина Дмитриевна
Средневековая история
Фантастика:
фэнтези
попаданцы
9.16
рейтинг книги
Средневековая история. Тетралогия

Хозяйка Междуречья

Алеева Елена
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Хозяйка Междуречья

Назад в СССР 5

Дамиров Рафаэль
5. Курсант
Фантастика:
попаданцы
альтернативная история
6.64
рейтинг книги
Назад в СССР 5

Столичный доктор. Том II

Вязовский Алексей
2. Столичный доктор
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Столичный доктор. Том II

Игрок, забравшийся на вершину. Том 8

Михалек Дмитрий Владимирович
8. Игрок, забравшийся на вершину
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
Игрок, забравшийся на вершину. Том 8

Довлатов. Сонный лекарь

Голд Джон
1. Не вывожу
Фантастика:
альтернативная история
аниме
5.00
рейтинг книги
Довлатов. Сонный лекарь

Идеальный мир для Лекаря 9

Сапфир Олег
9. Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
6.00
рейтинг книги
Идеальный мир для Лекаря 9

Система Возвышения. Второй Том. Часть 1

Раздоров Николай
2. Система Возвышения
Фантастика:
фэнтези
7.92
рейтинг книги
Система Возвышения. Второй Том. Часть 1

Чужое наследие

Кораблев Родион
3. Другая сторона
Фантастика:
боевая фантастика
8.47
рейтинг книги
Чужое наследие

Князь Мещерский

Дроздов Анатолий Федорович
3. Зауряд-врач
Фантастика:
альтернативная история
8.35
рейтинг книги
Князь Мещерский

Совок 2

Агарев Вадим
2. Совок
Фантастика:
альтернативная история
7.61
рейтинг книги
Совок 2

Царь поневоле. Том 2

Распопов Дмитрий Викторович
5. Фараон
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Царь поневоле. Том 2

Система Возвышения. (цикл 1-8) - Николай Раздоров

Раздоров Николай
Система Возвышения
Фантастика:
боевая фантастика
4.65
рейтинг книги
Система Возвышения. (цикл 1-8) - Николай Раздоров

Системный Нуб

Тактарин Ринат
1. Ловец душ
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Системный Нуб