2010-02-17 13 views
5

Possiedo un progetto Silverlight 3. Ho una casella di testo che è associata a dati TwoWay a un oggetto. Se l'utente desidera annullare le modifiche apportate alla casella di testo, qual è il modo migliore per annullare le modifiche al campo associato sull'oggetto?Come ripristinare le modifiche apportate a un oggetto in silverlight 3 con un binding TwoWay

So che potrei memorizzare il valore iniziale in una variabile separata quando l'oggetto è caricato, ma mi chiedevo se c'era un modo migliore per farlo?

Grazie.

risposta

0

Se si desidera eseguire il rollback quando il valore è impostato, quindi generare un'eccezione nel setter della proprietà. Se è necessario eseguire il rollback su submit, è necessario memorizzare le impostazioni in una classe separata e fornire impostazioni atomiche e rollback - assicurarsi che ciascuna delle proprietà supporti INotifyPropertyChanged.

5

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à.

Problemi correlati