【问题标题】:How to rollback changes made to a object in silverlight 3 with a TwoWay binding如何使用 TwoWay 绑定回滚 Silverlight 3 中对对象所做的更改
【发布时间】:2011-01-17 22:43:24
【问题描述】:

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

我知道我可以在加载对象时将初始值存储在一个单独的变量中,但我想知道是否有更好的方法来做到这一点?

谢谢。

【问题讨论】:

    标签: wpf silverlight silverlight-3.0 binding


    【解决方案1】:

    IEditableObject 在 MSDN (here) 上的示例实现显示了一种非常简单的方法来完成它。我认为这个实现更清晰一些,但另一方面微软可能测试了他们的:

    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 是什么。

    实现相当多的属性也相当容易;您只需确保在添加新属性时更新BeginEditCancelEdit

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-19
        • 2011-07-19
        • 1970-01-01
        • 1970-01-01
        • 2012-08-05
        • 1970-01-01
        • 2012-03-24
        • 2012-05-01
        相关资源
        最近更新 更多