使用ModuleManager在Prism中加载模块

时间:2008-12-18 23:56:36

标签: wpf prism modularity

此问题也发布在Prism's site on Codeplex

我在按需加载模块时有点迷失,我希望你们能够启发我。我正在使用 v2#7

这是我想要完成的事情:

  

1)我有2个区域 - 一个用于实例化模块的按钮(MenuRegion),另一个用于显示模块(MainRegion)。在MenuRegion中一次只能看到一个模块   2)模块可以在目录中找到   3)MenuModule模块与MenuRegion相关联,用于创建显示模块名称的按钮。单击其中一个按钮时,将加载相应的模块并显示在MainRegion中   4)行为:
  a)单击ModuleA按钮并显示ModuleA。用户在ModuleA中输入数据,数据保持未保存状态   b)单击ModuleB按钮并显示ModuleB。用户在ModuleB中输入数据,数据保持未保存状态   c)单击ModuleA按钮,并显示ModuleA,其中包含先前输入的信息。

如果我的假设错了,请纠正我,请给我其他建议:

  

1)MainRegion应该是一个ContentControl,因此一次只能看到一个模块   2)我想我需要枚举我的目录的“GrouplessModules”来获取目录中可用模块的ModuleInfo
  3)加载模块我想我需要调用myModuleManager.LoadModule(moduleName)

最后,我的问题:

  

1)我应该在我的MenuModuleView构造函数中将moduleManager作为参数吗?
  2)如何从MenuModuleView内部访问目录,以便枚举可用的模块?
  3)从MenuModuleView,我通过模块枚举,我创建按钮,将ModuleInfo分配给按钮的Tag属性。这样,我只有一个点击事件来加载模块。它是否正确?它对我来说闻起来有些麻烦......

非常感谢你的帮助!!!

1 个答案:

答案 0 :(得分:7)

  

1)我应该将moduleManager作为   我的MenuModuleView中的参数   构造

技术上你可以。实际上,如果你这样做,你仍然想要为你的视图定义一个默认构造函数。否则,您的视图将无法在设计人员中使用。因此,我建议使用属性将依赖项传递给UI组件。

  

2)如何获取目录?   从MenuModuleView内部按顺序   枚举可用的模块?

您将依赖于Prism的IModuleEnumerator接口,依赖注入将负责为您的视图提供模块枚举器。假设您在Unity容器中使用Prism,那将看起来像这样:

[Dependency]
public IModuleEnumerator ModuleEnumerator 
{
    get; set;
}
  

3)从MenuModuleView,我枚举   通过模块,我创建了   按钮,将ModuleInfo分配给   按钮的Tag属性。这样,我   只有一个点击事件来加载   模块。它是否正确?闻起来有点儿味道   对我来说有点工作......

我建议您让每个按钮引发相同的WPF命令,而是将ModuleInfo分配给Button的{​​{1}}属性。同样,Prism的基础设施可以帮助您在复合场景中干净利落地完成此任务。请参阅CommandParameter课程。

作为最后一点,请注意,虽然您可能懒得加载模块,但您将无法卸载它们。为此,你需要DelegateCommand隔离,这是另一个鱼的水壶。