Ich versuche, die Rückgängig machen/Wiederholen-Funktion für die Knoten eines Baumes in C# (TreeView-Komponente) zu implementieren. Ich habe das Memento-Muster verwendet, aber ich habe Probleme mit dem Redo-Teil. Ich kann nicht sehen, wo meine Logik fehlerhaft ist. Hier sind einige Schnappschüsse des CodesUndo/redo Memento-Muster C#
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;
}
In meiner Form, bevor sie einen Knoten zu löschen ich die SaveMemento() -Methode nenne das ein neues Memento-Objekt erstellt den aktuellen Zustand darstellt. Das Objekt wird zur _mementoStateList hinzugefügt.
Beim Rückgängigmachen und Wiederherstellen einer Aktion rufe ich die obige Undo() und Redo() Methode auf.
Ich gehe davon aus, dass ich die Staaten nicht im richtigen Moment rette? Jede Eingabe wird sehr geschätzt!
Wenn Sie ein neues Memento setzen, sollten Sie Ihre Undo-State-Liste zurücksetzen ... Sonst könnte diese Liste einen sehr seltsamen Inhalt bekommen, bestimmte Anwendungsfälle. – JHBonarius