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

Чтобы команда работала, ее нужно присоединить к свойству Command источника команды. Источников, к которым присоединена одна и та же команда, может быть несколько. Элементы, к которым можно присоединить команду, должны наследовать интерфейс ICommandSource. Только такие элементы будут иметь свойство Command. Этих элементов в WPF немного и все они показаны на рисунке

Интерфейс ICommandSource реализует свои свойства в ближайших наследниках ButtonBase, Hyperlink, InputBinding, MenuItem по общему синтаксису:

public System.Windows.Input.ICommand Command { get; set; } public object CommandParameter { get; set; } public System.Windows.IInputElement CommandTarget { get; set; }

В источнике для присоединения команды достаточно присвоить значение только ссылке Command на объект команды (на экземпляр RoutedCommand или RoutedUICommand). Остальные свойства являются необязательными и служат для уточнения команды:

  • CommandParameter - тип данных, определяемый пользователем, который используется для передачи информации обработчикам, реализующим команду
  • CommandTarget - идентифицирует элемент, в котором должна выполняться данная команда. Если значение свойства CommandTarget не задано, в качестве цели команды используется элемент, в котором установлен фокус ввода

Обратите внимание, что два наследуемые источниками команд свойства-ссылки Command и CommandTarget имеют типы интерфейсов, что позволяет адресовать любые команды и целевые элементы, наследующие эти интерфейсы.

Вот, например, как можно присоединить команду Paste к элементу меню в разметке

<StackPanel> <Menu Header="Edit"> <MenuItem Command="ApplicationCommands.Paste" /> </Menu> <TextBox /></StackPanel>

Для библиотечных команд синтаксис разметки допускает использование сокращенной записи, например

<StackPanel> <Menu Header="Edit"> <MenuItem Command="Paste" /> </Menu> <TextBox /></StackPanel>

Теперь, если объект TextBox имеет фокус ввода и буфер обмена содержит текст, то при выборе пользователем этого пункта меню текст из буфера будет вставлен в элемент TextBox. Обратите внимание, что объект MenuItem не устанавливает свойство Header для отображения в нем названия команды Paste. Если свойство для текста названия команды в источнике опущено, то источник способен сам извлекать эту информацию из объекта присоединенной команды.

А вот альтернативный вариант присоединения команды Paste к элементу меню в процедурном коде

// Создание объектов пользовательского интерфейсаStackPanel mainStackPanel = new StackPanel();TextBox pasteTextBox = new TextBox();Menu stackPanelMenu = new Menu();MenuItem pasteMenuItem = new MenuItem(); // Добавление объектов в коллекции панели и менюstackPanelMenu.Items.Add(pasteMenuItem);mainStackPanel.Children.Add(stackPanelMenu);mainStackPanel.Children.Add(pasteTextBox); // Присоединение библиотечной команды Paste к источнику командpasteMenuItem.Command = ApplicationCommands.Paste;

Аналогичный пример можно привести для присоединения команды к контекстному меню.

<StackPanel> <StackPanel.ContextMenu> <ContextMenu> <MenuItem Command="ApplicationCommands.Paste" /> </ContextMenu> </StackPanel.ContextMenu></StackPanel>// Создание объектов пользовательского интерфейсаStackPanel cmdSourcePanel = new StackPanel();ContextMenu cmdSourceContextMenu = new ContextMenu();MenuItem cmdSourceMenuItem = new MenuItem(); // Добавление ContextMenu в StackPanelcmdSourcePanel.ContextMenu = cmdSourceContextMenu;cmdSourcePanel.ContextMenu.Items.Add(cmdSourceMenuItem); // Присоединение библиотечной команды Paste к источнику командcmdSourceMenuItem.Command = ApplicationCommands.Paste;

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: