我试图找到以下方案的答案,但未能拿出答案。这可能是由于我自己承认,还没有完全掌握整个棱镜概念。在我的防守,我开始寻找到棱镜仅两天前,所以请温柔...棱镜 - 从松散耦合装配体注入视图
阅读大量的文献,我有以下设置后:
- 框架项目
- 壳牌项目
- MainMenu的项目(模块)
- SideMenu项目(模块)
- 状态条项目(模块)
- TestCont恩塔项目(模块)
- TestContentB项目(模块)
框架项目包含,除其他事项外,事件定义和有效载荷。
壳牌项目有,在shell.xaml内,四个区域:
- MainMenuRegion
- SideBarRegion
- StatusBarRegion
- ContentRegion
每个非壳牌项目有引用到以下棱镜组件:
- Microsoft.Practices.Prism
- Microsoft.Practices.ServiceLocation
- Microsoft.Practices.Unity
壳牌项目具有除了这些组件,提及:
- Microsoft.Practices.Prism.UnityExtensions
每个项目都有对Framework项目的引用,但没有一个引用解决方案中的任何其他项目。
在这一点上,我想指出,everthing按计划工作!
在MainMenuView项目中,我有几个MenuItems在MainMenuViewModel中有命令。
ViewModel使用EventAggregator发布了一些在Framework项目中声明的事件。
在壳牌项目中,ShellViewModel订阅这些事件,例如:
使用ContentControl中作为“ContentRegion”的控制,我可以TestContentA和TestContentB之间没有任何问题进行切换。就目前而言,无论是TestContentA和TestContentB也在利用
.RegisterViewWithRegion method(...)
注册我想要做的就是注入TestContentA和TestContentB到一个TabControl作为新的TabItem,而不是到ContentControl中控制。
因此,shell.xaml现在包含一个TabControl以及一个名为“TabRegion”的后续区域。后来我改变注册区域,从ContentRegion到TabRegion,再次使用
.RegisterViewWithRegion(...)
方法。
我已经看到了很多类似的例子:
IRegion tabRegion = regionManager.Regions["TabRegion"];
var tabView1 = container.Resolve();
tabRegion.Add(tabView1, "FirstTabView");
我没有集装箱在ShellViewModel,但即使我在这里有它,我现在还不能参考TestContentA观点,因为这是在另一个组件本身将在运行时找到。
与您可以在网上找到的样本不同,在样本项目中,要注入的视图总是看起来像。
在导航方法,如果我(用于调试)添加代码:
var tabRegion = regionManager.Regions["TabRegion"];
然后我可以看到tabRegion有一个View集合,并在该视图我可以看到从TestContentA两种观点并TestContentB告诉我视图已正确注册。问题是,我不知道如何“抓住”它们,以便我可以将视图的新实例作为TabItem注入。
如果我作弊并添加对TestContentA的引用,那么我可以简单地添加视图,并且TabItem将出现。这也告诉我,我几乎在那里但当然,没有任何参考是希望的。
综上所述,我的问题是:
如何从在应用程序启动时被发现了一种松散耦合的组件注入看法?
我会很感激,如果有人能指出我在正确的方向,因为我确信它可以完成。
感谢您花时间阅读本文!
谢谢moran-moshe, 上述模块(_TestControlA_和_TestControlB_)已正确注册。 我还可以看到视图在_IRegion_“TabRegion”的_Views_集合中正确注册。 我在帖子中提到过这个,对不起,如果我没有足够清楚。 我遇到的问题是在** Shell **项目中 - 我没有提到任何松散耦合的程序集。 The '.AddToRegion()' 方法语法请求要注入视图的区域的名称(TabRegion)以及视图的名称。视图是我无法达到的。 – user3235445
以Unity为例,您可以在每个控件(TestControlA和TestControlB)中获取IRegionManager,并将您的视图添加到区域。 你所有的观点必须知道的是地区名称。 –
我有shell订阅的MainMenu事件,想要注入一个新的视图到_TabRegion_区域,我现在看到的是不正确的。我从shell中删除了订阅,现在从TestModelA和TestModelB ViewModels订阅相同的事件,在这里我将视图添加到已知_TabControl_区域。这就像一个魅力,谢谢。我会很乐意投你的帮助作为答案,祝你有个美好的一天! – user3235445