Wpf:Prism + MVVM:更改模块/视图

时间:2014-06-12 05:20:48

标签: c# wpf mvvm prism

我正在使用MVVM + Prism开发WPF应用程序。 Shell分为两个区域:Menu + MainScreenArea。

菜单包括导航:搜索实体,添加实体,编辑实体。基本上mainScreenArea应该加载相应的模块/ View。如果在菜单区域中选择了搜索实体,则mainScreenArea应显示SearchEntity模块/视图。

我仍然没有编码,但我想我会为每个目的创建一个模块:SearchEntityModule,AddEntityModule等。

然后,MainWorkArea将根据菜单区域的相应点击按需更改模块。

现在,如何更改MainScreenArea区域中的模块?我应该从MenuRegion将nameOfModule加载到eventAggregator,而MainScreenArea是否会从聚合器中获取屏幕名称?

无论如何,我是新手,所以如果我走错方向,请将你的建议发给我。谢谢!

2 个答案:

答案 0 :(得分:0)

棱镜文档有关于导航的整个部分。这个问题的问题在于按需加载模块时有许多不同的方法。我发布了一个链接,希望能引导您朝着正确的方向前进。如果是,请将此标记为已回答。谢谢

http://msdn.microsoft.com/en-us/library/gg430861(v=pandp.40).aspx

答案 1 :(得分:0)

如前所述,有许多方法可以实现这一点。对于我的情况,我有一个类似的shell,它有一个导航区域和一个主区域,我的功能分为许多模块。我的模块都将自己的导航视图添加到该导航区域(在模块add的初始化中,他们自己的导航视图到导航区域)。通过这种方式,我的shell不知道各个模块及它们可能暴露的命令。

单击命令时,它所属的导航视图模型执行如下操作:

/// <summary>
/// switch to the view given as string parameter
/// </summary>
/// <param name="screenUri"></param>
private void NavigateToView(string screenUri)
{
    // if there is no MainRegion then something is very wrong
    if (this.regionManager.Regions.ContainsRegionWithName(RegionName.MainRegion))
    {
        // see if this view is already loaded into the region
        var view = this.regionManager.Regions[RegionName.MainRegion].GetView(screenUri);
        if (view == null)
        {
            // if not then load it now
            switch (screenUri)
            {
                case "DriverStatsView":
                    this.regionManager.Regions[RegionName.MainRegion].Add(this.container.Resolve<IDriverStatsViewModel>().View, screenUri);
                    break;
                case "TeamStatsView":
                    this.regionManager.Regions[RegionName.MainRegion].Add(this.container.Resolve<ITeamStatsViewModel>().View, screenUri);
                    break;
                case "EngineStatsView":
                    this.regionManager.Regions[RegionName.MainRegion].Add(this.container.Resolve<IEngineStatsViewModel>().View, screenUri);
                    break;
                default:
                    throw new Exception(string.Format("Unknown screenUri: {0}", screenUri));
            }
            // and retrieve it into our view variable
            view = this.regionManager.Regions[RegionName.MainRegion].GetView(screenUri);
        }
        // make the view the active view
        this.regionManager.Regions[RegionName.MainRegion].Activate(view);
    }
}

所以基本上该模块有3个可能的视图可以放入MainView,关键步骤是将它添加到区域并使其处于活动状态。