1

根据我的阅读,MVVM 的优点之一是它提供了分离。这很好,但有时您的 View 可能需要了解周围环境,例如在处理状态时。

在我的项目中,我的一个视图激活了一些后台任务,结果实时显示在屏幕上。问题是,如果我要点击我的文件 -> 新建,我将能够更改视图。在后台任务运行时,这是不可取的。

现在,我可以想办法解决这个问题,但它似乎违背了 MVVM 方法(对于这个项目,我想使用它,即使它也没有意义(让我更好地理解模式的优势/劣势))。

因此,假设我的项目是使用 MainWindow(它具有上下文菜单和显示我的视图的 ContentControl)和单个视图构建的。我可以看到使这项工作的唯一方法是将我的 MainWindow 的一个实例传递给我的 View 的 ViewModel (或者也许通过使用委托也可以)。然后我可以控制菜单等的可见性状态......这似乎是一个糟糕的设计选择,因为我必须为我制作的每个视图(更多工作)都这样做,而且我的系统现在非常紧密耦合。

我认为这一定是一个流行的问题,但我找不到任何建议的方法。

在我看来,拥有一个名为 StateControllingClass 或类似文件的额外文件将是一个很好的答案,但同样,在实例化它们以共享同一个对象时,我是否仍然需要将它作为参数传递给我的所有 ViewModel?

无论如何,我的问题是;使用标准 MVVM 方法(意思是,不使用 MVVM 框架)是否有更好的方法?

4

2 回答 2

2

我认为您应该查看事件聚合器模式。主要思想是在事件聚合器中注册的所有视图模型。如果发生某些事情,您可以将事件发布到聚合器。聚合器将事件传递给所有感兴趣的视图模型。因此,您可以轻松地保持应用程序的固态。您可以在Jeremy Miller
的博文 中阅读更多内容,并看看它是如何在 Caliburn.Micro框架中实现的。

于 2013-07-21T11:00:36.950 回答
1

较小的部分不应该了解整体。所以 ViewModel 不应该知道启动它的主窗口。

后台任务不应该知道启动它的 ViewModel。它可能应该有一个由启动它的 ViewModel 调用的取消方法。

然后,当 ViewModel 收到某种取消命令时,它可以使用此方法取消它正在运行的任何任务

当文件/新命令被菜单触发时,主菜单的 ViewModel 可以将此取消命令发送到活动 ViewModel

于 2013-07-21T11:46:06.913 回答