[英]Prism - Inject view from loosely-coupled assembly
我试图为以下情况找到答案,但未能给出答案。 我自己承认,这很可能是由于我尚未完全掌握整个棱镜概念。 为了辩护,我仅在两天前才开始调查Prism,所以请保持谨慎...
阅读大量文献后,我将进行以下设置:
框架项目除其他外,还包含事件定义和有效负载。
Shell项目在shell.xaml中具有四个区域:
每个非Shell项目都引用了以下Prism程序集:
Shell项目除了这些程序集之外,还引用了:
每个项目都引用了Framework项目,但是没有一个引用解决方案中的任何其他项目。
在这一点上,我想指出一切都按计划进行!
在MainMenuView项目中,我有一些MenuItems,这些菜单项在MainMenuViewModel中具有命令。
ViewEvent使用EventAggregator,发布在Framework项目中声明的几个Event。
在Shell项目中,ShellViewModel订阅以下事件,例如:
使用ContentControl作为“ ContentRegion”的控件,我可以毫无问题地在TestContentA和TestContentB之间切换。 目前,TestContentA和TestContentB都使用
.RegisterViewWithRegion method(...)
我想做的是将TestContentA和TestContentB作为新的TabItem注入到TabControl中,而不是注入到ContentControl控件中。
因此,shell.xaml现在包含一个TabControl以及一个名为“ TabRegion”的进一步区域。 然后,我再次通过使用将注册的Region从ContentRegion更改为TabRegion 。
.RegisterViewWithRegion(...)
方法。
我看过很多例子,例如:
IRegion tabRegion = regionManager.Regions["TabRegion"];
var tabView1 = container.Resolve();
tabRegion.Add(tabView1, "FirstTabView");
我在ShellViewModel中没有容器,但是即使在这里没有容器,我仍然不能引用TestContentA视图,因为它位于另一个程序集中,而该程序集本身将在运行时找到。
与您可以在网上找到的示例不同,要注入的视图始终似乎在示例项目中。
在Navigate方法中,如果我(出于调试目的)添加代码:
var tabRegion = regionManager.Regions["TabRegion"];
然后我可以看到tabRegion有一个View集合,并且在此视图中,我可以看到来自TestContentA和TestContentB的两个视图,告诉我这些视图已正确注册。 问题是我不知道如何“抓住”它们,以便可以将视图的新实例作为TabItem注入。
如果我作弊并添加对TestContentA的引用,则只需添加视图,TabItem就会出现。 这也告诉我,我快到了,但是当然不希望引用。
综上所述,我的问题是:
我如何从应用程序启动时发现的松耦合组件中注入视图?
如果有人可以指出正确的方向,我将不胜感激,因为我相信这是可以做到的。
感谢您抽出时间来阅读!
您将需要创建一个引导程序。 每个加载的模块都可以通过ServiceLocator获取区域管理器,然后将其视图注册到区域名称。 这样,Shell项目就不需要直接引用您的视图。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.