如何定义全局自定义RoutedCommand?

时间:2009-07-15 09:52:53

标签: wpf routed-commands

我想对2个按钮使用相同的自定义RoutedCommand,它们位于不同的窗口中。

为了不重复代码,我想在应用程序的某处定义命令并将其绑定到两个按钮。

我想过用Style来实现这个目标。下面,我用一个简单的样本重现我的问题。

我在App.Xaml中声明了样式:

<Application.Resources>
    <Style TargetType="{x:Type Window}">
        <Setter Property="CommandBindings">
        <Setter.Value>
    <!--<Window.CommandBindings>--> <!--I tried with or without this. Doesn't change-->
                <CommandBinding Command="{x:Static local:App.testBindingCommand}"
                    Executed="OnExecuted" CanExecute="OnCanExecute" />
      <!--</Window.CommandBindings>-->
        </Setter.Value>
        </Setter>
    </Style>
 </Application.Resources> 

App.Xaml.cs中的自定义命令:

public static RoutedCommand testBindingCommand = new RoutedCommand();

    private void OnExecuted(object sender, ExecutedRoutedEventArgs e)
    {
        System.Windows.MessageBox.Show("OnExecuted");
    }

    private void OnCanExecute(object sender, CanExecuteRoutedEventArgs e)
    {
        System.Windows.MessageBox.Show("OnCanExecute");

        e.CanExecute = true;
    }

编译器不喜欢代码并给出错误:

错误MC3080:无法设置Property Setter'CommandBindings',因为它没有可访问的set访问器。

AFAIK,Window类具有CommandBindings属性。

1)使用Style来声明全局CommandBindings是否正确?如果没有,我该怎么办?

2)为什么属性CommandBindings不能由样式设置?

谢谢!

1 个答案:

答案 0 :(得分:1)

您收到该错误消息是因为您正在将CommandBindings属性(类型为CommandBindingsCollection)的值设置为CommandBinding的实例。即使该属性具有setter(但它没有),也无法将CommandBinding设置为CommandBindingsCollection

考虑正常绑定命令的情况:

<Window>
    <Window.CommandBindings>
        <CommandBinding Command="{x:Static local:App.testBindingCommand}"
            Executed="OnExecuted" CanExecute="OnCanExecute" />
    </Window.CommandBindings>
</Window>

这不是将CommandBinding设置为CommandBindings属性,而是将其添加到CommandBindings的{​​{1}}集合中。

你必须使用Window吗?也许最好使用RoutedCommand的不同实现 - 可能是在执行命令时调用ICommand的实现。 Kent Boogaart有一个DelegateCommand的实现可以工作(还有许多其他类似的实现也在浮动 - 或者你可以编写自己的实现)。