これが私のプロジェクトで使用したソリューションです。ソリューションは完全に機能することが証明されました。
システムは元に戻すイベント オブジェクトを使用しており、各元に戻すイベントは、それ自体を元に戻す方法とやり直す方法を認識しています。
interface IUndoEvent
{
void Undo();
void Redo();
}
2 つの元に戻すイベントを実装するだけでシステムを構築できました。1 つはプロパティの変更用です。1 つはコレクションの変更用です。
これらのイベントは、モデルを直接変更することによって元に戻す/やり直しを実装するという考え方です。
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)
{
// Set Value on the _target using reflection (_propertyName)
}
}
ViewModel は、ViewModelBase 関数を呼び出して元に戻すイベントを作成します。
class MyViewModel : ViewModelBase
{
public string Name
{
get { return _model.Name; }
// The SetValue will create a undo event, and push it to the UndoManager
set { SetValue(_model, "Name", value); }
}
}
最後に、元に戻すスタックとやり直しスタックを格納する UndoManager (プロジェクト シングルトン) があります。