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



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

应用程序使用ribbon作为它的菜单系统。当用户单击ribbon上的按钮时,模块就会被加载(shell通过它的视图模型来处理这个任务)。模块向区域管理器注册它们的主视图(shell目前只定义一个主区域)。大多数模块都是按需加载的。这在一个简单的场景中工作得很好:

  • 用户点击按钮。模块被加载,视图被添加到区域并显示。
  • 用户点击其他模块的按钮。和上面的想法一样。该模块的视图显示在同一区域,取代前一个模块的视图。
当用户再次点击先前加载的模块的按钮时,事情就会停止工作。因为模块已经被加载了,所以几乎什么都没有发生——当前视图仍然显示在屏幕上。这是有道理的- LoadModule几乎被忽略了(或者至少看起来像是被忽略了)

我在Google上为此做了不少搜索,我找到的大多数答案都需要shell来导航到视图。现在,除非我弄错了,否则shell和模块之间的耦合有点太过了:shell不应该知道任何模块中的视图。从本质上讲,这似乎打破了MVVM模式。shell知道模块是一个必要的耦合(无论如何在我们的例子中—我们不(不能)使用目录发现之类的东西。但是在我看来,shell知道每个模块的视图是在推动它。

底线,问题是:我如何在现有视图之间导航,使用由shell控制的ribbon界面(好吧,事实上它是一个ribbon与此无关),通过让shell"告诉"一个已经加载的模块"嘿,你又有焦点了,所以显示上次你是节目明星时显示的任何视图。"

也许我只是走错了路…这也不是第一次。:)

谢谢!

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

看一下这个问题的答案:Prism中的EventAggregator通信该示例涵盖了如何在不知道接收者的情况下在Prism应用程序中进行通信。

也许你可以通过点击按钮来解决这个问题,你不仅加载模型,然后你迭代已经加载的模块,如果你已经存在,你在他的ViewModelView中设置为活动,如果ViewModel是活动的,你可以在ViewModel中查找属性,如果它是活动的,你用INotifyPropertyChange通知视图。

这只是一个大胆的猜测,我是新的MVVM和新的Prims:D

在您的RPISM安装下查看

棱镜快速入门 View-Switching导航

你的Shell不需要知道module。RegionManager将负责按需加载视图。

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

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

最新更新