Festlegen des Befehlsziels in XAML
Es fällt mir schwer, die CommandTarget-Eigenschaft für einen RoutedCommand zu verstehen.
Grundsätzlich habe ich einige statische Befehle, die Implementierungen in einem Benutzersteuerelement (nicht im Fenster) haben. Ich erstelle eine Befehlsbindung im Benutzersteuerelement. Wenn ich die Schaltfläche in der Benutzersteuerung deklariere, kann ich mein weitergeleitetes Ereignis verwenden. Wenn sich die Schaltfläche jedoch außerhalb der Benutzersteuerung befindet, kann ich mein weitergeleitetes Ereignis nicht verwenden. Ich denke, das Befehlsziel wird mein Problem lösen.
Wie lege ich das Befehlsziel für die Schaltfläche des Benutzersteuerelements in der Symbolleiste fest, sodass die Befehle "Executed" und "CanExecuted" des Containers aufgerufen werden?
Bearbeiteter Code mit Änderungen von Micahtan-Änderungen, aber ich kann ihn immer noch nicht zu CanExecute oder Execute bringen.
Windows 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>
Symbolleiste 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>
Symbolleiste 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>
Container 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>
Container 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>