2010-02-17 4 views
5

Ich habe ein Silverlight 3-Projekt. Ich habe ein Textfeld, in dem TwoWay-Daten an ein Objekt gebunden sind. Wenn der Benutzer die Änderungen, die er an der Textbox vorgenommen hat, abbrechen möchte, was ist der beste Weg, um die Änderungen am gebundenen Feld auf dem Objekt rückgängig zu machen?Wie man Änderungen an einem Objekt in silverlight 3 mit einer TwoWay-Bindung rückgängig macht

Ich weiß, ich könnte den Anfangswert in einer separaten Variablen speichern, wenn das Objekt geladen wird, aber ich frage mich, ob es eine bessere Möglichkeit, dies zu tun wäre?

Danke.

Antwort

0

Wenn Sie einen Rollback ausführen möchten, wenn der Wert festgelegt ist, dann werfen Sie eine Ausnahme im Eigenschaftensetter. Wenn Sie beim Senden eine Rollback-Operation durchführen müssen, sollten Sie die Einstellungen in einer separaten Klasse speichern und atomare Einstellungen und Rollbacks bereitstellen. Stellen Sie sicher, dass jede Ihrer Eigenschaften INotifyPropertyChanged unterstützt.

5

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.

Verwandte Themen