Ustawianie celu polecenia w XAML
Trudno mi zrozumieć właściwość CommandTarget dla RoutedCommand.
Zasadniczo mam kilka komend statycznych, które mają implementacje w formancie użytkownika (nie w oknie). Tworzę powiązanie poleceń w formancie użytkownika. Jeśli zadeklaruję przycisk w usercontrol, będę mógł użyć mojego zdarzenia routowanego. Jednak gdy przycisk znajduje się poza kontrolą użytkownika, nie mogę użyć mojego zdarzenia routowanego. Myślę, że cel polecenia rozwiąże mój problem.
Jak więc ustawić cel polecenia dla przycisku usercontrol na pasku narzędzi, aby wywołać kontener Executed i CanExecuted?
Zmieniony kod ze zmianami w stosunku do zmian micahtan, ale nadal nie mogę go pobrać do CanExecute lub Execute.
Okno XAML:
<code><Window x:Class="RoutedCommands.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:RoutedCommands" xmlns:toolbar="clr-namespace:RoutedCommands.Toolbar" Title="Window1" Height="300" Width="300"> <StackPanel> <local:Container Width="100" Height="25" x:Name="MyContainer" /> <toolbar:Toolbar Width="100" Height="25" CommandTarget="{Binding MyContainer}" /> </StackPanel> </Window> </code>
Pasek narzędzi XAML:
<code><UserControl x:Class="RoutedCommands.Toolbar.Toolbar" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:RoutedCommands" x:Name="MyToolbar" Height="300" Width="300"> <Grid> <Button Command="{x:Static local:Commands.MyCommand}" Content="Try Me" CommandTarget="{Binding ElementName=MyToolbar, Path=CommandTarget, Mode=OneWay}" /> </Grid> </UserControl> </code>
Pasek narzędzi CS:
<code> public partial class Toolbar : UserControl { public Toolbar() { InitializeComponent(); } // Using a DependencyProperty as the backing store for CommandTarget. This enables animation, styling, binding, etc... public static readonly DependencyProperty CommandTargetProperty = DependencyProperty.Register("CommandTarget", typeof(IInputElement), typeof(Toolbar), new UIPropertyMetadata(null)); public IInputElement CommandTarget { get { return (IInputElement)GetValue(CommandTargetProperty); } set { SetValue(CommandTargetProperty, value); } } } </code>
Pojemnik XAML:
<code><UserControl x:Class="RoutedCommands.Container" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:RoutedCommands" Height="300" Width="300"> <UserControl.CommandBindings> <CommandBinding Command="{x:Static local:Commands.MyCommand}" CanExecute="CommandBinding_CanExecute" Executed="CommandBinding_Executed" /> </UserControl.CommandBindings> <Grid> <Button Command="{x:Static local:Commands.MyCommand}" Content="Click Me" /> </Grid> </UserControl> </code>
Kontener CS:
<code>public partial class Container : UserControl { public Container() { InitializeComponent(); } private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e) { Console.WriteLine("My Command Executed"); } private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e) { Console.WriteLine("My Command Can Execute"); e.CanExecute = true; } } </code>
RoutedCommands:
<code>namespace RoutedCommands { public static class Commands { public static readonly RoutedUICommand MyCommand = new RoutedUICommand(); } } </code>