棱镜,MVVM和模块化

时间:2011-11-23 08:29:52

标签: wpf mvvm prism modularity

我(非常)最近开始研究Prism(用于WPF应用程序),我一直在为我的团队制作一个小型演示应用程序。我的问题是一个相当普遍的问题,但我找不到一个简单的例子来指导我:
假设我有Shell(在主模块中),并且Shell有一个区域应该由来自不同模块的内容填充(BTW,这是个好主意吗?)。
这怎么会发生?谁负责将其他模块的视图添加到Shell的指定区域?何时初始化其他模块的相关视图模型?代码示例/链接到他们将不胜感激。

谢谢!

修改:问题拆分,请参阅the new question

2 个答案:

答案 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]