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

时间:2014-01-25 16:23:33

标签: c# wpf tabcontrol prism-4

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

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

  1. 框架项目
  2. Shell Project
  3. MainMenu项目(模块)
  4. SideMenu项目(模块)
  5. StatusBar项目(模块)
  6. TestContentA项目(模块)
  7. TestContentB项目(模块)
  8. Framework项目包含事件定义和有效负载等。

    Shell项目在shell.xaml中有四个区域:

    • MainMenuRegion
    • SideBarRegion
    • StatusBarRegion
    • ContentRegion

    每个非Shell项目都引用了以下Prism程序集:

    • Microsoft.Practices.Prism
    • Microsoft.Practices.ServiceLocation
    • Microsoft.Practices.Unity

    除了这些程序集之外,Shell项目还引用了:

    • Microsoft.Practices.Prism.UnityExtensions

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

    此时我想指出一切按计划进行!

    在MainMenuView项目中,我有一些MenuItems,它们在MainMenuViewModel中有命令。

    ViewModel使用EventAggregator发布在Framework项目中声明的几个事件。

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

    使用ContentControl作为“ContentRegion”的控件,我可以在TestContentA和TestContentB之间切换,没有任何问题。目前,TestContentA和TestContentB都是使用

    注册的
    .RegisterViewWithRegion method(...)
    

    我想做的是将TestContentA和TestContentB作为新的TabItem注入TabControl,而不是注入到ContentControl控件中。

    所以shell.xaml现在包含一个TabControl以及一个名为“TabRegion”的进一步区域。然后我再次使用

    将已注册的区域从 ContentRegion 更改为 TabRegion
    .RegisterViewWithRegion(...)
    

    方法

    我见过很多例子:

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

    我在ShellViewModel中没有Container,但即使我在这里有它,我仍然无法引用TestContentA视图,因为这是在另一个程序集中,它本身将在运行时找到。

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

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

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

    然后我可以看到tabRegion有一个View集合,在这个视图中我可以看到来自TestContentA和TestContentB的两个视图,这些视图告诉我视图已正确注册。问题是我不知道如何“抓住”它们以便我可以将一个新的视图实例注入一个TabItem。

    如果我作弊并添加对TestContentA的引用,那么我只需添加视图即可显示TabItem。这也告诉我,我几乎就在那里但当然,没有人愿意参考。

    总结一下,我的问题是:

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

    如果有人能指出我正确的方向,我很感激,因为我确信可以做到。

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

1 个答案:

答案 0 :(得分:2)

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