代码之家  ›  专栏  ›  技术社区  ›  Oliver Hanappi

.NET中的事务对象

  •  3
  • Oliver Hanappi  · 技术社区  · 15 年前

    在用户界面中,编辑某些实体时通常需要实现一个取消按钮。在WPF中,如果可以使视图模型具有事务性,那就更好了。我会更详细地解释一下我的意思:

    视图模型连接到模型,并以更容易为视图处理的方式(利用数据绑定)公开数据。对视图模型的更改会导致模型中的更改。但是,如果有一个“取消”按钮,您通常不希望立即在模型上执行更改,因此我考虑某种缓冲更改。提交更改时,会将更改传输到模型,否则将删除这些更改。

    现在,我已经实现了一个解决方案,它创建了一个绑定到视图的视图模型代理,而不是实际视图模型。代理未连接到模型,但使用拦截器记录对属性和方法调用的更改。有一个提交方法可以将调用应用于真实视图模型。我认为这是一个很好的解决方案,但它仍然很麻烦(如果视图模型包含集合等)。

    我在找一个框架来做这种事情。外面有吗?

    顺祝商祺!
    奥利弗哈纳皮

    3 回复  |  直到 15 年前
        1
  •  1
  •   Bryan Anderson    15 年前

    BindingGroups 不仅用于绑定验证,还可以使用绑定组的beginedit、committedit和canceledit来启用事务逻辑。如果你是一个纯粹的MVVM类型,有一件事可能对你来说是个问题-你很可能会在你的视图中留下一些代码-否则它就像一个魅力。

        2
  •  2
  •   japf    15 年前

    你可以看看 Cinch MVVM Framework 萨夏理发师。

    它提供“编辑/取消编辑时存储/还原对象状态的IEditableObject用法”

        3
  •  1
  •   Jay    15 年前

    您可以断开其中一个绑定的连接,这样视图中的更改就不会一直传播到模型中,直到您(手动)这样做。这就是你已经做的。您还可以允许更新进行,但如果用户取消,则可以从数据库重新加载对象。

    其他选项包括实现IEditableObject,以回滚更改: http://msdn.microsoft.com/en-us/library/system.componentmodel.ieditableobject.aspx 当你试图对不平凡的事物进行深度复制时,这并不总是令人愉快的。

    我认为你的解决方案是好的,但我很好奇为什么收藏品会有问题。