WPF - 作为命令的Execute事件的模型方法(NO RelayCommand或DelegateCommand)

时间:2014-06-27 19:37:35

标签: c# wpf routed-commands

我想使用一个方法,该方法不在命令的Executed事件后面的代码中,另一个用于CanExecute

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

我得到的是一个Commands类:

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属性。

我想使用上面的方法作为我将传递给命令绑定的方法。如果他们不在后面的代码中,我该怎么做?

2 个答案:

答案 0 :(得分:0)

您需要向其中一个UI元素添加CommandBinding,因为RoutedUICommand需要在某处进行隧道和冒泡以进行处理。如果所有其他方法都失败了,那么你的MainWindow。

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

SyncExecute和SyncCanExecute需要可以访问此绑定的位置,因此私有不会。

答案 1 :(得分:0)

你好我写了一个"""自定义CommandBinding,您可以将RoutedCommand绑定到ICommand。 (How to bind a RelayCommand(MVVM) to a RoutedCommand? (CommandBinding)