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>
Подписаться на:
Комментарии к сообщению (Atom)
Комментариев нет:
Отправить комментарий