【问题标题】:How to use the same RoutedCommand in distinct controls?如何在不同的控件中使用相同的 RoutedCommand?
【发布时间】:2009-07-10 15:38:28
【问题描述】:

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

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

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

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

谢谢。

【问题讨论】:

    标签: wpf routed-commands


    【解决方案1】:

    大概您的RoutedCommand 是某个类的static 成员(例如Commands)。您需要将该 static 成员传递给 Command 属性:

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

    【讨论】:

    • 确实,我忘记了 x:Static... 谢谢,但这并不能解决我的问题。我编辑了我的问题以更正这一点并更准确。
    【解决方案2】:

    我自己回答:

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

    【讨论】:

    • 很遗憾,该链接不再有效。我会对提议的解决方案非常感兴趣,你能解释一下吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    相关资源
    最近更新 更多