.NET中的事务对象

时间:2010-01-22 15:38:15

标签: .net wpf mvvm transactions

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

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

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

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

最诚挚的问候,
Oliver Hanappi

3 个答案:

答案 0 :(得分:2)

你可以看看Sacha Barber的Cinch MVVM Framework

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

答案 1 :(得分:1)

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

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

我认为你的解决方案很好,但我很好奇为什么收集错误的原因。

答案 2 :(得分:1)

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