如何使用TwoWay绑定回滚对silverlight 3中的对象所做的更改

Sak*_*o73 5 silverlight wpf binding silverlight-3.0

我有一个Silverlight 3项目.我有一个文本框,它是绑定到对象的TwoWay数据.如果用户想要取消他们对文本框所做的更改,那么撤消对象上绑定字段的更改的最佳方法是什么?

我知道我可以在加载对象时将初始值存储在separte变量中,但我想知道是否有更好的方法来执行此操作?

谢谢.

Rob*_*ney 5

IEditableObjectMSDN上的示例实现(此处)显示了一种非常简单的方法来实现它.我认为这个实现有点清晰,但另一方面微软可能测试了他们的:

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;
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

使用此模式,Current始终包含对象的当前值,而不管其编辑状态如何,这使得属性访问器易于实现; 该IEditableObject方法只需要调整一下什么Current是.

即使是相当多的属性也很容易实现; 您必须确保更新BeginEditCancelEdit添加新属性.


Mic*_*ter 0

如果要在设置值时回滚,请在属性设置器中抛出异常。如果您需要在提交时进行回滚,那么您应该将设置存储在单独的类中并提供原子设置和回滚 - 确保您的每个属性都支持 INotifyPropertyChanged。