Die Beispielimplementierung von IEditableObject
auf MSDN (here) zeigt eine ziemlich direkte Möglichkeit, dies zu erreichen. Ich denke, diese Implementierung ist ein wenig klarer, aber auf der anderen Seite Microsoft wahrscheinlich getestet sie:
public class MyObject : ViewModelBase, IEditableObject
{
private struct MyData
{
string Foo,
string Bar
};
private MyData Saved = new MyData()
private MyData Current = Saved;
public string Foo
{
get { return Current.Foo; }
set
{
Current.Foo = value;
OnPropertyChanged("Foo");
}
}
public string Bar
{
get { return Current.Bar; }
set
{
Current.Bar = value;
OnPropertyChanged("Bar");
}
}
public void BeginEdit()
{
if (Current == Saved)
{
Current = new MyData();
Current.Foo = Saved.Foo;
Current.Bar = Saved.Bar;
}
}
public void CancelEdit()
{
if (Current != Saved)
{
Current = Saved;
OnPropertyChanged("Foo");
OnPropertyChanged("Bar");
}
}
public void EndEdit()
{
if (Current != Saved)
{
Saved = Current;
}
}
}
dieses Muster verwenden, Current
enthält immer die aktuellen Werte des Objekts unabhängig von seinem Bearbeitungszustand, der die Eigenschaftenaccessoren macht einfach zu implementieren; die IEditableObject
Methoden wechseln nur um was Current
ist.
Es ist ziemlich einfach, selbst eine ziemlich große Anzahl von Eigenschaften zu implementieren; Sie müssen nur sicher sein, BeginEdit
und CancelEdit
zu aktualisieren, wenn Sie eine neue Eigenschaft hinzufügen.