我一直在开发一个涉及移动许多形状的 WPF 应用程序。它主要是MVVM,严重依赖命令。直到最近,我才担心撤消/重做。我认为这不会太难,因为我的大多数更改都涉及继承实现 ICommand 的基类 CommandBase 的命令。
到目前为止,我已经添加了另一个名为IUndoCommand的接口,它使用ICommand。我添加了一个 Undo 方法,该方法将在调用撤消时执行所需的操作。
我将为撤消和重做使用堆栈,但是我遇到了执行/撤消方法的参数问题。有没有正确的方法来存储对象类型的这些参数?是否建议在 IUndoCommand 中添加字段/方法?如果是这样,我应该在 Execute 方法或构造函数中设置它(如果我可以的话)。
如果不是,我应该将其作为堆栈中自己的对象传递吗?
其次,(尽管这可能是它自己的问题)是否有更好的数据结构来跟踪多个命令?我目前有一个循环,它运行多个命令来移动多个选定的形状,并希望允许一个撤消来撤消它们。我想我可以将其转换为自己的命令并将命令传递给它,但我又是新手,宁愿做对。
感谢您的阅读,任何帮助将不胜感激。
来源:
代码项目视觉工作室杂志堆栈溢出
由于接口不需要访问数据(它只需要一个Undo()
/Redo()
方法对,并且可能需要一个标志来指示它是否可以撤消),因此它根本不需要知道参数。
一种选择可能是使IUndoCommand
的实现成为泛型的。 然后,您可以使用它以类型安全的方式存储参数。
然后,您的CommandBase
类可以是泛型的,即:
class CommandBase<T> : ICommand, IUndoCommand
{
// You could then store the parameter directly...
public T Parameter { get; private set; }
}