【问题标题】:Transactional objects in .NET [closed].NET 中的事务对象 [关闭]
【发布时间】:2010-01-22 15:38:14
【问题描述】:

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

视图模型连接到模型并以更易于视图处理的方式公开数据(利用数据绑定)。对视图模型的更改会导致模型的更改。但是,如果有一个取消按钮,您通常不希望立即在模型上执行更改,所以我想到了某种缓冲更改。当您提交更改时,它们会被转移到模型中,否则它们会被删除。

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

我正在寻找一个可以做这种事情的框架。有吗?

最好的问候,
奥利弗·哈纳皮

【问题讨论】:

    标签: .net wpf mvvm transactions


    【解决方案1】:

    您可以查看 Sacha Barber 的 Cinch MVVM Framework

    它提供“IEditableObject 使用来存储/恢复编辑/取消编辑时的对象状态”

    【讨论】:

      【解决方案2】:

      BindingGroups 不只是用于绑定验证,您可以使用 BindingGroup 的 BeginEdit、CommitEdit 和 CancelEdit 来启用事务逻辑。如果您是纯 MVVM 类型,那么您可能会遇到一件事 - 您很可能会在您的视图中获得一些代码隐藏 - 否则它就像一个魅力。

      【讨论】:

      • 感谢您的提示。我认为我绝对可以使用它,但前提是模型不包含集合,所以仍然不是完美的,但是一个很好的方法。
      【解决方案3】:

      您可以断开其中一个绑定,以便在您执行此操作(手动)之前,视图中的更改不会一直传播到模型。这是你已经完成的。您也可以允许更新通过,但如果用户取消,则从数据库重新加载对象。

      其他选项包括实现 IEditableObject,以回滚更改:http://msdn.microsoft.com/en-us/library/system.componentmodel.ieditableobject.aspx 当您尝试制作重要对象的深层副本时,这并不总是令人愉快的。

      我认为您的解决方案很好,但我很好奇为什么集合会出现问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-22
        • 2011-09-01
        • 1970-01-01
        相关资源
        最近更新 更多