首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用TwoWay绑定回滚对Silverlight3中的对象所做的更改

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

Stack Overflow用户
提问于 2010-02-18 00:16:29
回答 2查看 1K关注 0票数 5

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

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

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-02-18 00:32:29

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

票数 0
EN

Stack Overflow用户

发布于 2010-02-18 04:27:06

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

代码语言:javascript
复制
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即可。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2282313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档