我正在使用命令模式,并为每个命令执行撤消操作。我的视图通过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方法来实际执行更改。
但是,如果我将命令作为属性提供,要从视图中调用它们,它们将不会被添加到堆栈中,而只是执行它们。
现在的问题是,我在哪里推送执行命令在撤销堆栈上?
答案 0 :(得分:0)
为您的ICommand
导出一个新的UndoableCommand
类型,用于内部处理撤消/重做,并将依赖注入您的撤消/重做服务。将这些UndoableCommands作为VM的属性。