Przykładowa implementacja na MSDN (here) pokazuje dość prostą metodę jej wykonania. Myślę, że ta realizacja jest trochę jaśniejszy, ale z drugiej strony Microsoft prawdopodobnie testowana ich kompetencji:
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;
}
}
}
Stosując ten wzór, Current
zawsze zawiera aktualne wartości obiektu niezależnie od jego stanu edycji, która sprawia, że obiekty udostępniające właściwości łatwe do wdrożenia; metody IEditableObject
zmieniają tylko to, co jest Current
.
Jest dość łatwy do wdrożenia nawet dość dużej liczby właściwości; po dodaniu nowej właściwości musisz po prostu zaktualizować BeginEdit
i CancelEdit
.