2009-07-10 69 views
0

我有不同的文件中有2个不同的UI元素:一个menuItem(在window.xaml)和一个userControl(在foo.xaml)。如何在不同的控件中使用相同的RoutedCommand?

两者都具有完全相同的逻辑:它们仅在条件匹配并且调用相同方法时才启用。为了编码这个逻辑,我使用RoutedCommands

我可以在CanExecute在每个文件中使用2个不同RoutedCommands与相同条件执行的。有用。

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

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

这是TestRoutedCmmand.cs:

public class TestRoutedCommand 
{ 
    public static RoutedCommand test = new RoutedCommand(); 

    public static void OnTest(object sender, ExecutedRoutedEventArgs e) 
    { 
     System.Windows.MessageBox.Show("test -on"); 
    } 

    public static void CanTest(object sender, CanExecuteRoutedEventArgs e) 
    { 
     System.Windows.MessageBox.Show("test -can"); 

     e.CanExecute = true; 
    } 
} 

当我这样做,编译器报告此错误:

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个其他...这就是为什么它打扰我这么多。

谢谢。

回答

0

我回答自己:

由于编译器不接受的RoutedCommand的extern代表,最好的做法是使用的ICommand的自定义实现像these。没有更多的CommandBinding是必需的,问题解决了!

+1

不幸的是,链接不再有效。我会对提议的解决方案非常感兴趣,你能解释一下吗? – Wilbert 2013-07-15 16:00:45

1

想必您的RoutedCommand是一个static成员在一个类(例如,Commands)。您需要在static成员传递到Command属性:

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

的确,我忘了x:Static ...谢谢,但这并不能解决我的问题。我编辑了我的问题来纠正这个问题,并且更加精确。 – rockeye 2009-07-15 06:58:37

相关问题