这是我在项目中使用的解决方案。这个方案被证明完美运行。
系统正在使用撤销事件对象,每个撤销事件都知道如何撤销和重做自己。
interface IUndoEvent
{
void Undo();
void Redo();
}
我能够通过实现仅有的2个撤销事件来构建系统:一个用于属性更改,另一个用于集合更改。
这个想法是通过直接修改模型来实现撤销/重做。
class PropertyChangeUndoEvent : IUndoEvent
{
private ModelBase _target;
private string _propertyName;
private object _oldValue;
private object _newValue;
public PropertyChangeUndoEvent(ModelBase target, string propertyName, object oldValue, object newValue)
{
_target = target;
_propertyName = propertyName;
_oldValue = oldValue;
_newValue = newValue;
}
public void Undo()
{
SetValue(_oldValue);
}
public void Redo()
{
SetValue(_newValue);
}
private void SetValue(object value)
{
}
}
ViewModel 通过调用 ViewModelBase 函数来创建撤销操作事件:
class MyViewModel : ViewModelBase
{
public string Name
{
get { return _model.Name; }
set { SetValue(_model, "Name", value); }
}
}
最后,有一个UndoManager(项目单例)存储撤消堆栈和重做堆栈。