使用命令模式和ICommand跟踪撤消/重做跟踪参数。存储多个命令?

时间:2013-02-01 18:25:52

标签: wpf command undo command-pattern redo

我一直在研究涉及移动多种形状的WPF应用程序。它主要是MVVM,并且在很大程度上依赖于命令。直到最近我才担心撤消/重做。我不认为这会太困难,因为我的大多数更改都涉及继承实现ICommand的基类CommandBase的命令。

到目前为止,我添加了另一个名为IUndoCommand的接口,它使用ICommand。我添加了一个撤销方法,该方法将执行调用撤消时所需的操作。

我将使用Undo和Redo的堆栈,但是我遇到了Execute / Undo方法的参数问题。是否有正确的方法来存储类型对象的这些参数?是否可以向IUndoCommand添加字段/方法?如果是这样,我应该在Execute方法或构造函数中设置它(如果我可以的话。)

如果不是,我应该将它作为自己在Stack中的对象传递吗?

其次,(虽然这可能是它自己的问题)是否有更好的数据结构来跟踪多个命令?我目前有一个循环,它运行多个命令来移动多个选定的形状,并希望允许一个撤消撤消它们。我想我可以将它转换为自己的命令并将命令传递给它,但我又是新手,并且宁愿做正确的事。

感谢阅读,非常感谢任何帮助。

来源:

Code Project VisualStudioMagazine StackOverFlow

1 个答案:

答案 0 :(得分:1)

由于接口不需要访问数据(它应该只需要一个Undo() / Redo()方法对,并且可能是一个标志,它是否可以撤消),它不需要完全了解参数。

一种选择可能是让IUndoCommand通用的实现。然后,您可以使用它以类型安全的方式存储参数。

您的CommandBase课程可以是通用的,即:

class CommandBase<T> : ICommand, IUndoCommand
{
    // You could then store the parameter directly...
    public T Parameter { get; private set; }
}