Как откатить изменения, внесенные в объект в silverlight 3 с привязкой TwoWay - PullRequest
5 голосов
/ 17 февраля 2010

У меня есть проект Silverlight 3. У меня есть текстовое поле, в котором данные TwoWay связаны с объектом. Если пользователь хочет отменить изменения, внесенные в текстовое поле, каков наилучший способ отменить изменения в связанном поле объекта?

Я знаю, что могу сохранить начальное значение в отдельной переменной при загрузке объекта, но мне было интересно, есть ли лучший способ сделать это?

Спасибо.

Ответы [ 2 ]

5 голосов
/ 17 февраля 2010

Пример реализации 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 при добавлении нового свойства.

0 голосов
/ 17 февраля 2010

Если вы хотите откатиться при заданном значении, то выведите исключение в установщик свойства. Если вам нужно выполнить откат при отправке, вам следует сохранить настройки в отдельном классе и предоставить элементарные настройки и откат - убедитесь, что каждое из ваших свойств поддерживает INotifyPropertyChanged.

...