C# WPF-将方法建模为命令的执行事件(无RelayCommand或DelegateCommand)

C# WPF-将方法建模为命令的执行事件(无RelayCommand或DelegateCommand),c#,wpf,routed-commands,C#,Wpf,Routed Commands,我想为命令的已执行事件使用一个不在代码隐藏中的方法,为CanExecute使用另一个方法 我使用的是RoutedCommand,我不想使用委托命令或中继命令 我得到的是一个命令类: public class Commands { static Commands() { syncCommand = new RoutedUICommand("Sync", "syncCommand", typeof(Commands)); undoCommand = n

我想为命令的
已执行
事件使用一个不在代码隐藏中的方法,为
CanExecute
使用另一个方法

我使用的是
RoutedCommand
,我不想使用委托命令或中继命令

我得到的是一个命令类:

public class Commands
{
    static Commands()
    {
        syncCommand = new RoutedUICommand("Sync", "syncCommand", typeof(Commands));
        undoCommand = new RoutedUICommand("Undo", "UndoCommand", typeof(Commands));
    }

    private static MyHandler handler;
    public static MyHandler Handler
    {
        set { handler = value; }
        get { return handler; }
    }

    private static RoutedUICommand syncCommand;
    public static RoutedUICommand SyncCommand
    {
        get
        { return syncCommand; }
    }

    private static void SyncCanExecute(object sender, CanExecuteRoutedEventArgs e)
    {
        e.CanExecute = Handler != null;
    }

    private static void SyncExecute(object sender, ExecutedRoutedEventArgs e)
    {
        Handler.Action();
    }

    private static RoutedUICommand undoCommand;
    public static RoutedUICommand UndoCommand
    {
      get {  return undoCommand; }
    }

    private static void UndoCanExecute(object sender, CanExecuteRoutedEventArgs e)
    {
        e.CanExecute = Handler.WereChangesMade();
    }

    private static void UndoExecute(object sender, ExecutedRoutedEventArgs e)
    {
        Handler.Undo();
    }
}
在ViewModel中,我得到了ICommand属性和按钮,以及绑定到这些属性的Command属性


我想使用上述方法作为传递给命令绑定的方法。当它们不在代码隐藏中时,我该怎么做呢?

您需要向其中一个UI元素添加一个CommandBinding,因为RoutedUICommand需要在某个地方进行隧道和气泡处理。如果所有其他操作都失败,请打开主窗口

CommandBindings.Add(new CommandBinding(Commands.SyncCommand, Commands.SyncExecute, Commands.SyncCanExecute));

SyncExecute和SyncCanExecute需要可访问到此绑定的位置,因此private无法访问。

您好,我编写了一个“排序”自定义命令绑定,您可以将RoutedCommand绑定到ICommand。()

如何从Xaml实现它?这里我可能错了,但我认为x:Static关键字不支持方法。MSDN上的措辞是:“引用任何静态值代码实体”。来源()。我试过:。您正在将MVVM模式与WPF和bit进行争论。如果你喜欢使用XAML(而不是RelayCommand),你可以在你的视图中实现命令本身。。RoutedCommands更好地支持多个Commands的SourcesRelay命令允许您将逻辑放在ViewModel中,以便进行测试。诸如撤销之类的某些事情应该(并且是通过WPF)在UI中的每个能够撤销的控件上实现。但是,任何对数据本身进行实际操作的命令都应该在ViewModel上实现。因此,您可以使用常规RoutedCommands,调用ViewModel并在那里实现它,或者直接将命令绑定到ViewModel。RelayCommand可以支持多个源,您只需要正确的ViewModel范围(例如,MainWindowViewModel)