此问题也发布在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属性。这样,我只有一个点击事件来加载模块。它是否正确?它对我来说闻起来有些麻烦......
非常感谢你的帮助!!!
答案 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
隔离,这是另一个鱼的水壶。