Пример реализации IEditableObject
в MSDN ( здесь ) показывает довольно простой способ сделать это. Я думаю, что эта реализация немного понятнее, но, с другой стороны, Microsoft, вероятно, проверила их:
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;
}
}
}
Используя этот шаблон, Current
всегда содержит текущие значения объекта независимо от его состояния редактирования, что облегчает реализацию средств доступа к свойствам; IEditableObject
методы просто переключаются вокруг Current
.
Достаточно легко реализовать даже довольно большое количество свойств; вам просто нужно обязательно обновить BeginEdit
и CancelEdit
при добавлении нового свойства.