L'implementazione di esempio di IEditableObject
su MSDN (here) mostra un modo piuttosto semplice per realizzarlo. Credo che questa implementazione è un po 'più chiaro, ma d'altra parte Microsoft probabilmente loro provato:
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;
}
}
}
Usando questo modello, Current
contiene sempre i valori attuali dell'oggetto indipendentemente dal suo stato di montaggio, il che rende i accesso alle proprietà facile da implementare; i metodi IEditableObject
cambiano semplicemente cosa è Current
.
È ragionevolmente facile implementare anche un numero piuttosto elevato di proprietà; devi solo essere sicuro di aggiornare BeginEdit
e CancelEdit
quando aggiungi una nuova proprietà.
fonte
2010-02-17 20:27:06