Привязка к маршрутизируемым командам в WPF

WPF предоставляет мощное средство работы с командами - маршрутизируемые команды. Благодаря им возможно просто обрабатывать одну и ту же команду в разных элементах графического интерфейса. В следующем примере списки listbox1 и listbox2 по-разному обработают маршрутизируемую команду Copy.

<!-- При нажатии на эту кнопку будет выполнена команда Copy -->

<Button Command="{x:Static ApplicationCommands.Copy}" />

<ListBox x:Name="list1">

<ListBox.CommandBindings>

<!--Привязка одних обработчиков к команде Copy-->

<CommandBinding Command="{x:Static ApplicationCommands.Copy}" Executed="CopyExecuted1" CanExecute="CopyCanExecute1"/>

</ListBox.CommandBindings>

</ListBox>



<ListBox x:Name="list2">

<ListBox.CommandBindings>

<!--Привязка других обработчиков к команде Copy-->

<CommandBinding Command="{x:Static ApplicationCommands.Copy}" Executed="CopyExecuted2" CanExecute="CopyCanExecute2"/>

</ListBox.CommandBindings>

</ListBox>

При использовании шаблона M-V-VM часто возникает необходимость связать выполнение какой-либо маршрутизируемой команды с командой в модели представления. Так и хочется порой написать

<CommandBinding Command="{x:Static ApplicationCommands.Copy}" TargetCommand="{Binding CopyCommand}"/>,

где CopyCommand - реализация команды (интерфейса ICommand) в классе модели представления. Но, к сожалению, класс CommandBinding не реализует подобную возможность. Для решения данной проблемы были разработаны вспомогательные классы. И теперь для привязки маршрутизируемой команды к команде модели представления в элементе достаточно определить прикрепляемое свойство RoutedCommandRedirector.Redirectors как приведено в следующем примере.

<ListBox x:Name="list1">

<Input:RoutedCommandRedirector.Redirectors>

<!-- Теперь при выполнении маршрутизируемой команды Copy будет выполнена команда CopyCommand1 связанного со списком объекта -->

<Input:RoutedCommandRedirector RoutedCommand="{x:Static ApplicationCommands.Copy}" TargetCommand="{Binding CopyCommand1}"/>

</Input:RoutedCommandRedirector.Redirectors>

</ListBox>



<ListBox x:Name="list2">

<Input:RoutedCommandRedirector.Redirectors>

<!-- Теперь при выполнении маршрутизируемой команды Copy будет выполнена команда CopyCommand2 связанного со списком объекта -->

<Input:RoutedCommandRedirector RoutedCommand="{x:Static ApplicationCommands.Copy}" TargetCommand="{Binding CopyCommand2}"/>

<!-- Теперь при выполнении маршрутизируемой команды Paste будет выполнена команда PasteCommand2 связанного со списком объекта -->

<Input:RoutedCommandRedirector RoutedCommand="{x:Static ApplicationCommands.Paste}" TargetCommand="{Binding PasteCommand2}"/>

</Input:RoutedCommandRedirector.Redirectors>

</ListBox>

Комментариев нет:

Отправить комментарий