在XAML中执行命令时,将命令放入撤消/重做堆栈的位置?

时间:2013-04-19 13:46:06

标签: wpf xaml mvvm undo-redo

我正在使用命令模式,并为每个命令执行撤消操作。我的视图通过viewmodel绑定到命令。

ExampleCode:

XAML:

<Button Command="{Binding MyCommand}">

视图模型:

public class ViewModel : UndoRedoClass
{
    public ViewModel()
    {
        MyCommand = new MyCommand(this);
    }

    public ICommand {get;private set;}
}

UndoRedoClass

public class UndoRedoClass
{
    private Stack<IUndoCommand> undoCommands;

    //...

    ExecuteCommand(IUndoCommand cmd)
    {
        undoCommands.push(cmd);
        cmd.Execute();
    }
}

所以我通常可以通过ViewModel.ExecuteCommand(cmd)来调用命令,这些命令会被正确地推送到我的撤销堆栈。 如果我使用事件,这没有问题,因为我可以使用ViewModel的ExecuteCommand方法来实际执行更改。 但是,如果我将命令作为属性提供,要从视图中调用它们,它们将不会被添加到堆栈中,而只是执行它们。

现在的问题是,我在哪里推送执行命令在撤销堆栈上?

1 个答案:

答案 0 :(得分:0)

为您的ICommand导出一个新的UndoableCommand类型,用于内部处理撤消/重做,并将依赖注入您的撤消/重做服务。将这些UndoableCommands作为VM的属性。