我一直在研究涉及移动多种形状的WPF应用程序。它主要是MVVM,并且在很大程度上依赖于命令。直到最近我才担心撤消/重做。我不认为这会太困难,因为我的大多数更改都涉及继承实现ICommand的基类CommandBase的命令。
到目前为止,我添加了另一个名为IUndoCommand的接口,它使用ICommand。我添加了一个撤销方法,该方法将执行调用撤消时所需的操作。
我将使用Undo和Redo的堆栈,但是我遇到了Execute / Undo方法的参数问题。是否有正确的方法来存储类型对象的这些参数?是否可以向IUndoCommand添加字段/方法?如果是这样,我应该在Execute方法或构造函数中设置它(如果我可以的话。)
如果不是,我应该将它作为自己在Stack中的对象传递吗?
其次,(虽然这可能是它自己的问题)是否有更好的数据结构来跟踪多个命令?我目前有一个循环,它运行多个命令来移动多个选定的形状,并希望允许一个撤消撤消它们。我想我可以将它转换为自己的命令并将命令传递给它,但我又是新手,并且宁愿做正确的事。
感谢阅读,非常感谢任何帮助。
来源:
答案 0 :(得分:1)
由于接口不需要访问数据(它应该只需要一个Undo()
/ Redo()
方法对,并且可能是一个标志,它是否可以撤消),它不需要完全了解参数。
一种选择可能是让IUndoCommand
通用的实现。然后,您可以使用它以类型安全的方式存储参数。
您的CommandBase
课程可以是通用的,即:
class CommandBase<T> : ICommand, IUndoCommand
{
// You could then store the parameter directly...
public T Parameter { get; private set; }
}