MVVM:GUI 和 ViewModel 之间的真正分离

MVVM: True seperation between GUI and ViewModels

我正在寻找 MVVM View 和 ViewModel 之间 TRUE 的良好 example/way 分离。我什至不想在 View 中引用 1 个 ViewModel 或其他方式。


问题描述

只是为了形象化我的问题: 想象一下 3 个独立的项目; GUI(视图)、逻辑(视图模型)和模型。

概览:

如何设置解决方案,使其不会产生循环引用?

接近

我的一个想法是使用第四个项目作为某种经纪人:

我不喜欢的是,在这种情况下,Logic(ViewModel) 项目将是主要项目。或者也许还好,我只是有种奇怪的感觉。

大家怎么看?


编辑

感谢 Charles Mager,我找到了一篇非常有趣的文章,其中预定义了一个映射,因此当他调用 ShowDialog 方法时,它会根据 UI 加载的映射来决定。 CodeProject: Showing Dialogs When Using the MVVM Pattern

如果您在 View 和 ViewModel 之间没有一个引用,那么为什么您的 ViewModels 项目试图引用 Views 项目?

您的图片暗示这是为了允许显示对话框。在这种情况下,您通常会在 ViewModels 项目中定义一个接口,该接口具有方法 ShowDialog(object viewModel) - 将其称为 IDialogService 或其他名称。

然后您将拥有第 4 个 bootstrapper 项目,它将负责启动应用程序,显示主要 Window 并将实现此 IDialogService,将 ViewModel 映射到视图并显示它。

VM 了解 View 更值得怀疑,你应该避免它。您可能希望在 View 项目中实现对话框功能。仅仅因为它的逻辑并不意味着 VM 应该负责它。如果您让视图模型强制执行 ShowDialog() 之类的方法,那么您可能应该重构 VM 并将 ShowDialog() 方法调用拉入 View 库。如果您必须使用 VM 触发它,请在 ViewModel 上定义方法委托以使其触发,但将 ShowDialog() 分配给视图层中的该委托。