我想对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不能由样式设置?
谢谢!
答案 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的实现可以工作(还有许多其他类似的实现也在浮动 - 或者你可以编写自己的实现)。