使用MVVM的Prism - 如何从shell激活已加载模块中的视图

时间:2011-09-20 14:49:40

标签: wpf mvvm prism

我目前正在熟悉Prism 4.0和MVVM(使用Cinch 2.0作为MVVM框架。)我正在为大约15个模块的应用程序构建shell。我们正在使用WPF。

应用程序为其菜单系统使用功能区。当用户单击功能区上的按钮时,将加载模块(shell通过其视图模型处理该任务。)模块使用区域管理器注册其主视图(shell目前仅定义一个主区域。)大多数模块按需加载。这在一个简单的场景中工作正常:

  • 用户点击按钮。模块被加载,视图被添加到区域并显示。
  • 用户点击某个其他模块的按钮。与上面的想法相同。该模块的视图显示在同一区域中,替换了上一个模块中的视图。

当事情停止工作时,用户然后再次点击先前加载的模块的按钮。由于模块已经加载,几乎没有任何反应 - 当前视图仍然显示在屏幕上。这是有道理的 - LoadModule几乎被忽略了(或者至少看起来它被忽略了。)

我已经在Google上进行了不少搜索,我找到的大多数答案都需要shell导航到视图。现在,除非我弄错了,否则这会将shell与模块耦合得太多:shell不应该知道任何模块中的视图。从本质上讲,这似乎打破了MVVM模式。知道模块的shell是必要的耦合(在我们的情况下无论如何 - 我们不会(不能)使用目录发现之类的东西。但是在我看来,了解每个模块的视图的shell正在推动它。

最重要的是,问题是:如何在现有视图之间导航,使用功能区界面(好吧,这是一个功能区对此没有影响的事实)由shell控制,通过使shell“告诉” “一个已装载的模块”嘿,你再次得到了焦点,所以显示你上一次成为节目明星时显示的任何视图。“

那么也许我只是以错误的方式去做...不会是第一次。 :)

谢谢!

3 个答案:

答案 0 :(得分:1)

如果您不想从shell激活视图,那么您可以做的是创建一个CompositePresentationEvent,它将包含模块的名称或任何可以识别精确模块的数据类型。然后使用Prism的EventAggregator在整个应用程序中广播此事件。最后让你的模块听这个事件。如果它们在事件中被识别为激活其视图所需的模块,那么只需将代码放入以激活视图。

看看这个问题的答案:EventAggregator communication in Prism该示例介绍了如何在不知道收件人的情况下在Prism应用程序内部进行通信。

答案 1 :(得分:0)

也许您可以通过按钮点击解决问题再点击您不仅加载模型然后迭代已经加载的模块,如果您已经存在,则您在 ViewModel 中设置为活动状态 View 可以在 ViewModel 中查找属性(如果它是否处于活动状态),并使用 INotifyPropertyChange 通知View。

这只是一个狂野的猜测我是 MVVM 的新手,甚至更新的 Prims :D

答案 2 :(得分:0)

在您的RPISM安装下,请查看

  

Prism \ Quickstarts \ View-Switching Navigation

您的Shell无需了解模块。 RegionManager将负责按需加载视图。

此示例将向您展示按钮(左侧的单选按钮)如何使用“导航”更改视图。如果创建相同或新实例,您可以使用MEF进行控制。

想法是你只注册菜单(你的功能区)的视图。然后你只需导航。如果您需要更多信息,请告诉我