WPF,ApplicationCommands,RoutedUICommand和CommandBindings

时间:2014-05-29 15:38:30

标签: wpf menuitem

您好我在使用WPF创建一个类似于ApplicationCommand的RoutedUICommand时遇到了问题。理想情况下,我希望有一个“重复”的复制品。 MenuItem适用于两个不同的UserControl。 MenuItem是否处于活动状态取决于选择的UserControl以及UserControl是否包含所选对象(以不同文本框的剪切,复制和过去工作方式相同)。

根据这个StackOverflow,我在下面创建了静态类:

namespace App.Classes
{
    public static class myCommands
    {
        private static readonly RoutedUICommand _duplicateCmd = new RoutedUICommand("Duplicate", "Duplicate", typeof(myCommands));

        public static RoutedUICommand Duplicate
        {
            get { return _duplicateCmd; }
        }
    }
}

在主窗口的XAML文件中,我添加了对类命名空间的引用和命令的KeyBinding。

<Window x:Class="GUI.App.Views.Windows.wndMain"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:classes="clr-namespace:App.Classes">

<Window.InputBindings>
    <KeyBinding Key="D" Modifiers="Control" Command="{Binding classes:myCommands.Duplicate}" />
</Window.InputBindings>

在MenuItem中,我添加了一个Command绑定到&#39; Duplicate&#39;命令

<MenuItem Name="mnCopy" Header="Copy" Command="ApplicationCommands.Copy" InputGestureText="Ctrl+C" />      
<MenuItem Name="mnDuplicate" Header="Duplicate" Command="{Binding classes:myCommands.Duplicate}" InputGestureText="Ctrl+D"/>

最后,在我的每个UserControl中,我都将CommandBindings添加到了&#39; Duplicate&#39;和其他ApplicationCommands。

<UserControl.CommandBindings> 
    <CommandBinding Command="ApplicationCommands.Copy" Executed="CommandBinding_Copy" CanExecute="CommandBindingCanExecute_Copy" />
    <CommandBinding Command="classes:myCommands.Duplicate" Executed="CommandBinding_DuplicateControls" CanExecute="CommandBindingCanExecute_DuplicateControls" />
</UserControl.CommandBindings>

每个UserControls的Executed和CanExecute的代码隐藏是

/// <summary>                                                                                                   
///                                                                                                             
/// </summary>                                                                                                  
public void CommandBinding_Copy(Object sender, ExecutedRoutedEventArgs e)
{
    _viewModel.Copy();
}

/// <summary>                                                                                                   
///                                                                                                             
/// </summary>                                                                                                  
public void CommandBinding_Duplicate(Object sender, ExecutedRoutedEventArgs e)
{
    _viewModel.Duplicate();
}

/// <summary>                                                                                                   
///                                                                                                             
/// </summary>                                                                                                  
public void CommandBindingCanExecute_Copy(Object sender, CanExecuteRoutedEventArgs e)
{
    _viewModel.CanExecute_Copy();
}

/// <summary>                                                                                                   
///                                                                                                             
/// </summary>                                                                                                  
public void CommandBindingCanExecute_Duplicate(Object sender, CanExecuteRoutedEventArgs e)
{
    _viewModel.CanExecute_Duplicate();
}

这适用于我的ApplicationCommands,并根据选择的UserControl调用相应的已执行 CanExecute 。但是我无法使用我的“复制品”来解决这个问题。 RoutedUICommand。有人知道我做错了什么或错过了什么?将不胜感激任何人都可以提供任何帮助。

1 个答案:

答案 0 :(得分:2)

您通过Path绑定到静态属性,但这不起作用。将Binding更改为x:Static并且应该正常工作

<MenuItem Name="mnCopy" Command="ApplicationCommands.Copy" />      
<MenuItem Name="mnDuplicate" Command="{x:Static classes:myCommands.Duplicate}"/>

在旁注上RoutedUICommand重载了构造函数,该构造函数接受InputGestureCollection,您可以在创建命令时绑定 Ctrl + D 。< / p>

private static readonly RoutedUICommand _duplicateCmd = 
    new RoutedUICommand(
           "Duplicate", 
           "Duplicate", 
           typeof(myCommands), 
           new InputGestureCollection(new InputGesture[] { new KeyGesture(Key.D, ModifierKeys.Control) }));

的优点是您不必指定InputGestureText,因为您不必指定ApplicationCommands.Copy,并且因为您使用RoutedUICommand,所以您也不需要指定{ {1}}。如果您这样做默认情况下HeaderInputGestureText将从Header 中获取,您实际需要针对RoutedUICommand指定的所有内容均为MenuItem