0

我想对位于不同窗口中的 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:无法设置属性设置器“CommandBindings”,因为它没有可访问的设置访问器。

AFAIK,Window 类有一个 CommandBindings 属性。

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

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

谢谢!

4

1 回答 1

1

您收到该错误消息是因为您将CommandBindings属性(类型为CommandBindingsCollection)的值设置为CommandBinding. 即使该属性有一个设置器(它没有),您也不能将 a 设置CommandBinding为 a CommandBindingsCollection

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

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

这不是将 设置CommandBindingCommandBindings属性,而是将其添加CommandBindingsWindow.

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

于 2009-07-15T11:24:34.027 回答