2010-02-17 19 views
5

Mam projekt Silverlight 3. Mam pole tekstowe, które jest danymi TwoWay związanymi z obiektem. Jeśli użytkownik chce anulować zmiany wprowadzone w polu tekstowym, jaki jest najlepszy sposób cofnięcia zmian w powiązanym polu obiektu?Jak cofnąć zmiany dokonane w obiekcie w silverlight 3 z wiązaniem TwoWay

Wiem, że mogłem zapisać wartość początkową w zmiennej separte, gdy obiekt jest załadowany, ale zastanawiałem się, czy istnieje lepszy sposób na zrobienie tego?

Dzięki.

Odpowiedz

0

Jeśli chcesz wycofać po ustawieniu wartości, rzuć wyjątek w ustawieniu właściwości. Jeśli musisz wykonać przywracanie po przesłaniu, powinieneś zapisać ustawienia w oddzielnej klasie i zapewnić ustawienia atomowe i wycofywanie zmian - upewnij się, że każda z Twoich usług obsługuje INotifyPropertyChanged.

5

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.