0

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

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

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

我想改进代码以遵循 DRY 规则并将 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 个方法......这就是为什么它让我如此困扰。

谢谢。

4

2 回答 2

1

大概您RoutedCommandstatic某个班级的成员(例如,Commands)。您需要将该static成员传递到Command属性中:

<CommandBinding Command="{x:Static local:Commands.TestCommand}"
                    Executed="RoutedCommands.TestRoutedCommand.OnTest"
                    CanExecute="RoutedCommands.TestRoutedCommand.CanTest" />
于 2009-07-10T15:51:59.753 回答
0

我自己回答:

由于编译器不接受带有 RoutedCommand 的外部委托,因此最佳实践是使用 ICommand 的自定义实现,例如这些。不再需要 CommandBinding,问题就解决了!

于 2009-07-16T07:29:07.293 回答