如何使用MEF和MVVM将PRISM模块添加到工具栏

时间:2012-01-10 14:50:38

标签: wpf mvvm prism mef

我正在使用PRISM 4.0和MEF作为我的容器。我在我的Shell中定义了2个区域,ToolBar和MainRegion。工具栏区域使用自定义RegionBehaviour - AutoPopulateExportedViewsBehaviour自动填充ToolBarModule。我的MainRegion可以包含一个或多个View模块,这些模块将通过第三方Dock布局管理器停靠。

我在创建工具栏按钮以表示应用程序中的可用视图时遇到问题。我的想法是使用ToolBarService或Event模式,以便每个View模块可以以解耦的方式向ToolBar注册自己。

然而,在我调用RegionManager.RegisterViewWithRegion ...

之前,我的View模块构造函数似乎没有被调用。

如何控制模块的初始化,以便他们可以使用ToolBar进行注册。因此允许他们添加按钮但实际上不显示视图本身。仅当单击刚刚注册的视图按钮时,才会显示视图。

由于

2 个答案:

答案 0 :(得分:0)

  

如何控制模块的初始化,以便它们可以   注册工具栏但不是最初显示?

我不确定你的意思。

我知道你希望模块在加载时注册它自己的导航部分。我有类似的情况,我在顶部的菜单栏和下面的按钮栏。加载后的每个模块 - 使用初始化代码插入自己的按钮/菜单:

public void Initialize()
        {
            this.RegionManager.RegisterViewWithRegion(RegionNames.Menu, typeof(NavigationView));
            this.RegionManager.RegisterViewWithRegion(RegionNames.Toolbar, typeof(ToolbarNavigationView));
        }

这些区域有实际的按钮/项目,按下时会调用其他内容。例如,这里是NavigationViewModel

namespace IDATT.Module.SystemManager.ViewModels
{
    using System;
    using System.ComponentModel.Composition;

    using Microsoft.Practices.Prism.Regions;

    [Export]
    public class NavigationViewModel
    {
        [Import]
        public ISecurityService SecurityService { get; set; }

        [Import]
        public IRegionManager RegionManager { get; set; }

        public void Mail()
        {
            this.RegionManager.RequestNavigate(RegionNames.Tabs, new Uri(typeof(MailView).Name, UriKind.Relative));
        }

        public void MaintainUser()
        {
            this.RegionManager.RequestNavigate(RegionNames.Tabs, new Uri(typeof(MaintainUserView).Name, UriKind.Relative));
        }

        public void MaintainGroup()
        {
            this.RegionManager.RequestNavigate(RegionNames.Tabs, new Uri(typeof(MaintainGroupView).Name, UriKind.Relative));
        }

        public void MaintainMailTemplate()
        {
            this.RegionManager.RequestNavigate(RegionNames.Tabs, new Uri(typeof(MaintainMailTemplateView).Name, UriKind.Relative));
        }

        public void SetUpOptions()
        {
            this.RegionManager.RequestNavigate(RegionNames.Tabs, new Uri(typeof(SetUpSystemManagerOptionsView).Name, UriKind.Relative));
        }

        public void Logout()
        {
            this.SecurityService.Logout();
        }
    }
}

答案 1 :(得分:0)

看起来我可以通过使用自定义RegionBehaviour“强制”调用我的视图模块的构造函数。在此我可以将我的视图模块转换为特定的基本视图或接口类型并调用一个函数。然后,这将使用工具栏注册我的视图,但不一定在我的应用程序的“主”区域中显示视图。

感谢您的帮助。