0

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

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

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

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

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

感谢您的阅读,任何帮助将不胜感激。

资料来源:

代码项目 VisualStudioMagazine StackOverFlow

4

1 回答 1

1

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

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

然后你的CommandBase类可以是通用的,即:

class CommandBase<T> : ICommand, IUndoCommand
{
    // You could then store the parameter directly...
    public T Parameter { get; private set; }
}
于 2013-02-01T18:29:56.893 回答