从我的阅读来看,MVVM的一个优点是它提供了分离。这很好,但有时您的View可能需要了解周围环境,例如,处理状态时。
在我的项目中,我的一个视图会激活一些后台任务,结果会实时显示在屏幕上。问题是,如果我那么点击我的文件 - >新的,我可以改变视图。在后台任务运行时,这是不可取的。
现在,我可以想办法解决这个问题,但它似乎违背了MVVM方法(对于这个项目,即使它没有意义,我也想使用它(给我一个更好地理解模式的优点/缺点))。
因此,假设我的项目是使用MainWindow(具有上下文菜单和显示我的View的ContentControl)和单个视图构建的。我可以看到使这项工作的唯一方法是将我的MainWindow实例传递给我的View的ViewModel(或者也许通过使用委托也可以)。然后,我可以控制菜单的可见性状态......这似乎是一个糟糕的设计选择,因为我必须为我制作的每个视图(更多的工作)做这个,而我的系统现在非常紧密耦合。
我认为这一定是一个受欢迎的问题,但我找不到任何建议方法。
在我的脑海中,有一个名为StateControllingClass或类似文件的额外文件将是一个很好的答案,但同样,我还是必须将它作为参数传递给我的所有ViewModel,同时实例化它们以共享同一个对象吗? / p>
无论如何,我的问题是;有没有更好的方法使用标准的MVVM方法(意思是,不使用MVVM框架)?
答案 0 :(得分:2)
我认为你应该看一下Event Aggregator模式。主要思想是在事件聚合器中注册的所有视图模型。如果发生了某些事情,您可以将事件发布到聚合器。聚合器将事件传递给所有感兴趣的视图模型。因此,您可以轻松维护应用程序的固态 您可以在Jeremy Miller blogpost中阅读更多内容,并了解这个implemented in Caliburn.Micro框架。
答案 1 :(得分:1)
较小的部分不应该知道整体。所以ViewModel不应该知道启动它的主要Windows。
后台任务不应该知道启动它的ViewModel。它应该有一个取消方法,由启动它的ViewModel调用。
ViewModel然后可以使用此方法取消它在收到某种取消命令时运行的任何任务
当菜单触发file / new命令时,主菜单的ViewModel可以将此取消命令发送到活动的ViewModel