同步多个视图,编辑器和提交/取消

时间:2011-05-06 09:03:30

标签: c# architecture mvvm synchronization editor

我们正在考虑在同一对象上支持多个视图和编辑器的架构。要求是可以提交或取消对整个对象所做的更改。

我们的要求是 - 同时编辑很多对象(在多选模式下最多10.000) - 同时具有多个视图和编辑器 - 对象编辑器的更改应仅在成功提交后反映在其他视图中 - 编辑器中的对象应该可以作为一个整体提交/取消

我们已经看过几个概念,包括动态包装器方法(http://www.codeproject.com/KB/cs/dynamicobjectproxy.aspx#EditableProxy%28implementingIEditableObject%299),我们因为 - 没有关于动态的智能感知 - 没有动态编译时间检查 - 迭代它们时对属性的访问(例如对于属性网格)是非常昂贵的

我们在图中实现了架构原型

每个编辑器都有自己的原始对象克隆。然后它可以处理它,验证它并将其提交到imodelrepository中。这样做时,原始对象会更新,并且每个克隆都会发送一个backendchanged事件。其他编辑器的视图模型为backendchanged事件注册,现在获得新的克隆以反映更改

积极的方面是: - imodelrepository只输出克隆,禁止直接编辑原文 - 每个编辑器都可以使用它自己的克隆 - 如果一个编辑器提交更改,有一种方法可以通知其他克隆并更新内容 但消极方面是: - 每个编辑器/查看器视图模型必须查找在原始对象发生更改时发送的后端更改对象。然后它需要获得一个新的克隆并丢弃旧的克隆 - 此外,如果另一个编辑器删除了该对象,则每个编辑器/查看器都必须查找对象已删除的事件。然后它需要丢弃它的克隆 - 需要大量克隆,这会降低系统速度,特别是对于同时编辑对象的大量克隆

我们正在考虑将原始文件交给仅注册为查看者的视图模型,并将克隆用于真正的编辑器。这将减少所需克隆的数量。但是没有办法确保观众只读原文(动态只读包装导致与上面提到的editableproxy相同的问题)

我会感谢任何关于如何简化方法或关于不同架构的输入或想法

THX

Synchronizing multiple Views

1 个答案:

答案 0 :(得分:0)

  • 如果同时打开同一模型对象上的多个编辑器,则 然后等待提交更新其他人将是反直觉(*),
    在这种情况下,我会为它们使用相同的VM,并让它们在中间状态中编辑对象,并使用全局提交从VM的更改中更新存储库。

  • 如果同一模型对象上方的多个编辑器无法同时打开,则 然后一次一个VM(每个模型对象)应该这样做 您可以使用T4为查看者生成只读VM类,这与原始VM类相同,只是没有属性设置器。

(*)例如use可以更新名称,其他查看者/编辑器仍会显示旧名称,用户可以在两个不同的编辑器中将名称编辑为两个不同的值而无需提交。
如果提交了一个编辑器更改,则在重新克隆期间其他编辑器中的更改可能会丢失。

  • 另一种方法是为所有观众提供一个只读VM(可以从编辑器的VM生成T4),
    允许多个编辑器更新相同的模型对象,在存储库中使用基于时间戳的并发(乐观并发),并继续为每个编辑器提供单独的VM。
    更改将在提交时提供给存储库,已打开的编辑在尝试提交之前不会知道更改 当他们尝试提交时,如果已经编辑了模型对象,则会抛出异常(例如EF中的OptimisticConcurrencyException),您可以捕获该异常以使用户能够做出反应(disgard,overwrite,merge)。