双向视图模型与"实时"集合和属性同步

Jac*_*eja 7 wpf design-patterns mvvm

最近关于View Models(VM)的问题让我感到很紧张.

就像这个人一样,我得出结论,我需要在我的VM上公开的集合通常包含与业务对象上公开的集合不同的类型.

因此,必须在这两种类型之间进行双向映射或转换.(只是为了使事情复杂化,在我的项目中,这些数据是"实时"的,这样一旦你更改了一个属性,它就会被传输到其他计算机)

我可以使用像桁架这样的框架来应对这个概念,尽管我怀疑在某个地方会有一个令人讨厌的惊喜.

不仅必须转换对象,还需要在这两个集合之间进行同步.(只是为了使我能想到的事情复杂化,VM集合可能是业务对象集合的子集或联合,而不仅仅是1:1的同步).

我可以看到如何使用复制的ObservableCollection或像CLINQ这样的单向"实时"同步.

然后问题变成:创建/删除项目的最佳方法是什么?

双直接同步似乎没有出现 - 我没有发现这样的例子,唯一支持远程的类就是ListCollectionView.双向同步甚至是添加回业务对象集合的合理方式吗?

我见过的所有样品似乎都没有解决任何这种"复杂"的问题.

所以我的问题是:你如何解决这个问题?是否有一些技术可以从VM更新模型集合?对此最好的一般方法是什么?

Nat*_*nAW 3

我也正在努力解决两个集合的双向同步问题,以便通过 MVVM 与 WPF 一起使用。我在博客中写了MVVM:包装还是不包装?ViewModel 应该包裹 Model 多少?(第 1 部分)MVVM:换行还是不换行?ViewModel 也应该包装集合吗?(第 2 部分)关于该问题,包括一些显示双向同步的示例代码。然而,正如帖子中指出的,实施并不理想。我将其视为概念证明。

我喜欢Alex_P 发布的BLINQCLINQObtics框架。这是获得同步行为一侧的非常好的方法。也许另一端(从虚拟机到模型)可以通过替代路径实现?我刚刚在我的博客上发布了第 3 部分,其中讨论了其中的一些内容。

据我所知,在 LINQ 语句将数据投影到新结构的情况下,不支持通过 BLINQ 和 CLINQ 进行双向。

但是,在 LINQ 查询返回与底层集合相同的数据类型的情况下,CLINQ 看起来确实可以支持双向同步。这更多的是一个过滤场景,与将数据包装在模型中的 ViewModel 的用例不匹配。

  • 很高兴看到我不是唯一一个正在解决这个问题的人:)我得出的结论是VM集合应该是只读的,然后使用另一种机制,例如添加/删除命令。不过我还没有对此进行 POC (3认同)