Wpf 如何在不同的控件中使用相同的RoutedCommand?

Wpf 如何在不同的控件中使用相同的RoutedCommand?,wpf,routed-commands,Wpf,Routed Commands,在不同的文件中有两个不同的UI元素:一个menuItem(在window.xaml中)和一个userControl(在foo.xaml中) 两者具有完全相同的逻辑:仅当条件匹配并调用相同的方法时,才会启用它们。要编写此逻辑,我使用RoutedCommands 我可以在每个文件中使用两个不同的RoutedCommand,在CanExecute和Executed中使用相同的条件。它起作用了 我想改进代码以遵循D.R.Y.规则,并将routedCommand和附加方法外部化。这是两个文件中的绑定: &

在不同的文件中有两个不同的UI元素:一个menuItem(在window.xaml中)和一个userControl(在foo.xaml中)

两者具有完全相同的逻辑:仅当条件匹配并调用相同的方法时,才会启用它们。要编写此逻辑,我使用RoutedCommands

我可以在每个文件中使用两个不同的RoutedCommand,在CanExecuteExecuted中使用相同的条件。它起作用了

我想改进代码以遵循D.R.Y.规则,并将routedCommand和附加方法外部化。这是两个文件中的绑定:

<CommandBinding Command="{x:Static RoutedCommands:TestRoutedCommand.test}"
                    Executed="RoutedCommands:TestRoutedCommand.OnTest"
                    CanExecute="RoutedCommands:TestRoutedCommand.CanTest" />
执行此操作时,编译器会报告以下错误:

Error   1   unknown generation error, 'MC6005 :        
Executed="RoutedCommands:TestRoutedCommand.OnTest" is not valid.  
'RoutedCommands:TestRoutedCommand.OnTest' is not a valid name for an event handler method. 
Only instance methods of the generated class or code-behind are valid
(译文可能不准确,因为原文不是英文)

似乎不支持外部方法,但我确信我没有遗漏什么。我想知道我的方法是否是静态的

是否有其他方法可以将我的方法外部化,或者我必须继续使用这4种方法,只调用另外2种方法

注意:在我的项目中,这是30多个重复的routedCommand方法,仅调用其他2个。。。这就是为什么它让我如此烦恼


谢谢。

您的
RoutedCommand
可能是类中的
静态成员(例如,
命令
)。您需要将该
静态
成员传递到
命令
属性:

<CommandBinding Command="{x:Static local:Commands.TestCommand}"
                    Executed="RoutedCommands.TestRoutedCommand.OnTest"
                    CanExecute="RoutedCommands.TestRoutedCommand.CanTest" />

我回答自己:


由于编译器不接受RoutedCommand的外部委托,因此最佳做法是使用ICommand like的自定义实现。不再需要CommandBinding,问题就解决了

事实上,我忘记了x:Static。。。谢谢,但这并不能解决我的问题。我编辑了我的问题,以纠正这一点,更准确地说。不幸的是,链接不再有效。我对提议的解决方案很感兴趣,你能解释一下吗?
<CommandBinding Command="{x:Static local:Commands.TestCommand}"
                    Executed="RoutedCommands.TestRoutedCommand.OnTest"
                    CanExecute="RoutedCommands.TestRoutedCommand.CanTest" />