我(非常)最近开始研究Prism(用于WPF应用程序),我一直在为我的团队制作一个小型演示应用程序。我的问题是一个相当普遍的问题,但我找不到一个简单的例子来指导我:
假设我有Shell(在主模块中),并且Shell有一个区域应该由来自不同模块的内容填充(BTW,这是个好主意吗?)。
这怎么会发生?谁负责将其他模块的视图添加到Shell的指定区域?何时初始化其他模块的相关视图模型?代码示例/链接到他们将不胜感激。
谢谢!
修改:问题拆分,请参阅the new question。
答案 0 :(得分:2)
在您的引导程序中,您将定义一个模块目录(覆盖CreateModuleCatalog),该目录列出了将在您的应用程序中使用的模块。每个模块都有一个实现IModule的类,它包含一个在创建模块时调用的Initialize方法。在此范围内,您将定义要添加到shell上的区域的内容:
public void Initialize()
{
RegisterViewsAndServices(); //Method to register dependencies
IMyViewModel model = _container.Resolve<IMyViewModel>();
_regionManager.Regions[RegionNames.ShellHeaderRegion].Add(model);
}
这里我向shell添加了一个viewmodel,我在外面定义了一个资源字典,用于确定应该通过DataTemplate应用哪个视图。
Prism文档(特别是第2章)有很多有用的信息。 http://msdn.microsoft.com/en-us/library/gg406140.aspx
答案 1 :(得分:1)
是的,分离shell和视图是一个好主意。
RegionManager负责将视图添加到区域中。因此,您将区域注册到RegionManager以及将视图注册到RegionManager。
在shell中你会得到类似的东西:
<Window xmlns:Regions="clr-namespace:Microsoft.Practices.Prism.Regions;assembly=Microsoft.Practices.Prism"
xmlns:Inf="clr-namespace:YourNamespace.Infrastructure;assembly=YourNamespaceInfrastructure">
<Grid>
<ContentControl
Regions:RegionManager.RegionName="{x:Static Inf:RegionNames.MainRegion}"/>
</Grid>
</Window>
现在您必须将视图注册到它将驻留的区域:
public class FirstModule : IModule
{
public void Initialize( )
{
RegionManager.RegisterViewWithRegion( RegionNames.MainRegion,
typeof( MainView ) );
RegionManager.RegisterViewWithRegion( RegionNames.SecondRegion,
( ) => Container.Resolve<ISomethingViewModel>( ).View );
}
}
示例代码显示了两种类型的注册。第一个用于查看第一个方法,后者用于视图模型第一个方法。
<强> [编辑] 强>
区域名称在基础架构模块的静态类中定义:
namespace YourNamespace.Infrastructure
{
public static class RegionNames
{
public const string MainRegion = "MainRegion";
//...
}
}
<强> [/ EDIT] 强>