棱镜 - 从松散耦合的组件注入视图



我试图找到以下方案的答案,但未能提出答案。这很可能是由于我自己的承认,还没有完全掌握整个棱镜概念。在我的辩护中,我仅两天前就开始研究棱镜,所以请保持温柔...

阅读了许多文献后,我有以下设置:

  1. 框架项目
  2. 壳项目
  3. Mainmenu项目(模块)
  4. sidemenu项目(模块)
  5. 状态栏项目(模块)
  6. TestContenta项目(模块)
  7. TestContentB项目(模块)

框架项目包括事件定义和有效载荷。

外壳项目在shell.xaml中具有四个区域:

  • 大型Menuregion
  • sidebarregion
  • statusbarregion
  • Content Region

每个非壳项目都提到以下棱镜组件:

  • microsoft.practices.prism
  • microsoft.practices.servicelecote
  • microsoft.practices.unity

外壳项目除了这些组件外,还引用:

  • microsoft.practices.prism.unityextensions

每个项目都有对框架项目的引用,但是没有一个参考解决方案中的任何其他项目。

在这一点

在Mainmenuview项目中,我有一些Menuitems在MainmenuviewModel中具有命令。

使用EventAggregator的ViewModel在框架项目中发布了几个事件。

在Shell项目中,ShellViewModel订阅了这些事件,例如:

使用ContentControl作为" ContentRegion"的控件,我可以在TestContenta和TestContentB之间切换,毫无问题。目前,也使用

进行了testContenta和testContentB的注册
.RegisterViewWithRegion method(...)

我想做的就是将TestContenta和TestContentB注入TabControl,作为新的TabItem,而不是进入ContentControl控件。

so shell.xaml现在包含一个TabControl以及一个名为" TabRigion"的未来区域。然后,我再次使用

将注册区域从 contentrigion 更改为 tabregion
.RegisterViewWithRegion(...)

方法。

我看到了很多示例:

IRegion tabRegion = regionManager.Regions["TabRegion"];
var tabView1 = container.Resolve();
tabRegion.Add(tabView1, "FirstTabView");

我没有ShellViewModel中的容器,但是即使我在这里确实有它,我仍然无法参考TestContenta视图,因为这是在另一个组件中,在运行时可以找到。

与您可以在线找到的样本不同,要注入的视图总是在示例项目中。

在导航方法中,如果我(用于调试目的)添加代码:

var tabRegion = regionManager.Regions["TabRegion"];

然后,我可以看到TabRigion有一个视图集合,在此视图中,我可以看到TestContenta和TestContentB的视图,告诉我视图已正确注册。问题是我不知道如何"抓住"它们,以便我可以将视图的新实例注入tabitem。

如果i 作弊并将引用添加到testContenta,那么我可以简单地添加视图,然后将出现tabitem。这也告诉我我几乎在那里,但是当然,不希望参考。

总结一下,我的问题是:

如何从启动应用程序启动时发现的松散耦合组件中注入视图?

如果有人可以将我指向正确的方向,我会很感激。

感谢您抽出宝贵的时间阅读!

您需要创建一个bootstrapper。每个已加载的模块可以通过ServiceLocator获取区域管理器,而不是将其视图注册到区域名称。这样,Shell项目就不需要包含对您视图的直接引用。

最新更新