【发布时间】:2017-06-28 20:52:32
【问题描述】:
我正在尝试在 C#(treeView 组件)中为树的节点实现撤消/重做功能。我使用了纪念品模式,但我在重做部分遇到了麻烦。我看不出我的逻辑在哪里有缺陷。以下是一些代码截图
private List<Memento> _mementoStateList= new List<Memento>();
private List<Memento> _undoStateList= new List<Memento>();
public Memento Memento { get{return null;}
set{_mementoStateList.Add(value);} }
public Memento Undo()
{
if (!_mementoStateList.Any()) return null;
Memento m = _mementoStateList.Last();
_undoStateList.Add(m);
_mementoStateList.Remove(m);
return m;
}
public Memento Redo()
{
if (!_undoStateList.Any()) return null;
Memento m = _undoStateList.Last();
_mementoStateList.Add(m);
_undoStateList.Remove(m);
return m;
}
在我的表单中,在删除节点之前,我调用了 SaveMemento() 方法,该方法创建了一个表示当前状态的新 Memento 对象。对象被添加到 _mementoStateList。
当撤消和重做一个动作时,我调用上面的 Undo() 和 Redo() 方法。
我假设我没有在正确的时刻保存状态? 任何意见都非常感谢!
【问题讨论】:
-
当你设置一个新的纪念品时,你应该重置你的 undo-state-list... 否则这个列表可能会得到一个非常奇怪的内容是某些用例。
标签: c# design-patterns undo redo memento