2014-01-25 36 views
1

我试图找到以下方案的答案,但未能拿出答案。这可能是由于我自己承认,还没有完全掌握整个棱镜概念。在我的防守,我开始寻找到棱镜仅两天前,所以请温柔...棱镜 - 从松散耦合装配体注入视图

阅读大量的文献,我有以下设置后:

  1. 框架项目
  2. 壳牌项目
  3. MainMenu的项目(模块)
  4. SideMenu项目(模块)
  5. 状态条项目(模块)
  6. TestCont恩塔项目(模块)
  7. 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”的后续区域。后来我改变注册区域,从ContentRegionTabRegion,再次使用

.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将出现。这也告诉我,我几乎在那里但当然,没有任何参考是希望的。

综上所述,我的问题是:

如何从在应用程序启动时被发现了一种松散耦合的组件注入看法?

我会很感激,如果有人能指出我在正确的方向,因为我确信它可以完成。

感谢您花时间阅读本文!

回答

2

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

+0

谢谢moran-moshe, 上述模块(_TestControlA_和_TestControlB_)已正确注册。 我还可以看到视图在_IRegion_“TabRegion”的_Views_集合中正确注册。 我在帖子中提到过这个,对不起,如果我没有足够清楚。 我遇到的问题是在** Shell **项目中 - 我没有提到任何松散耦合的程序集。 The '.AddToRegion()' 方法语法请求要注入视图的区域的名称(TabRegion)以及视图的名称。视图是我无法达到的。 – user3235445

+0

以Unity为例,您可以在每个控件(TestControlA和TestControlB)中获取IRegionManager,并将您的视图添加到区域。 你所有的观点必须知道的是地区名称。 –

+0

我有shell订阅的MainMenu事件,想要注入一个新的视图到_TabRegion_区域,我现在看到的是不正确的。我从shell中删除了订阅,现在从TestModelA和TestModelB ViewModels订阅相同的事件,在这里我将视图添加到已知_TabControl_区域。这就像一个魅力,谢谢。我会很乐意投你的帮助作为答案,祝你有个美好的一天! – user3235445