棱镜,统一和多视图ala MDI

时间:2012-05-14 17:34:49

标签: wpf prism tabcontrol mdi

我正在尝试创建一个类似于Visual Studio的应用程序,因为我们有一个主内容区域(即文档显示在TabControl中,而不是真正的MDI界面),旁边有一个菜单。

到目前为止,我已经所有工作,除了内容。我的目标是当用户双击侧面导航菜单中的项目时,它会在“内容”区域中打开文档。这很有效,但每次双击它都会产生同一视图的 new 实例。我可以在TabControl内容容器中拥有相同类型(但不同的“名称”)的多个视图。

现在,我的代码看起来像这样......

            IRegion contentRegion = IRegionManager.Regions[RegionNames.ContentRegion];

            object view = IUnityContainer.Resolve(viewModel.ViewType, viewModel.UniqueName);

            if (!IUnityContainer.IsRegistered(viewModel.ViewType, viewModel.UniqueName))
            {
                IUnityContainer.RegisterInstance(viewModel.UniqueName, view);
                contentRegion.Add(view);
            }

            contentRegion.Activate(view);

然而,即使我注册了该视图,该视图仍然永远不会注册...我想我可能做错了 - 是否有其他方法可以做到这一点? (回复:正确的方式)

1 个答案:

答案 0 :(得分:0)

所以,问题是试图这样做。智能方法(对于其他任何尝试这样做的人)都是以正确的方式使用Prism。

我最终做的是导航:

<强> 1 即可。在导航菜单中,构建一个UriQuery(包含在Prism中),其中包含我想要显示的视图的唯一ID(保证是唯一的),并将其添加到我想导航到的视图中,即:

    IRegionManager.RequestNavigate(RegionNames.ContentRegion, new Uri(ViewNames.MyViewName + query.ToString(), UriKind.Relative));

其中query是UriQuery对象。

<强> 2 即可。通过以下方式在模块中注册View和ViewName:

        IUnityContainer container = ServiceLocator.Current.GetInstance<IUnityContainer>();
        container.RegisterType<object, MyView>(Infrastructure.ViewNames.MyViewName);

第3 即可。在视图中,确保ViewModel是构造函数上的参数。让Prism为我们手动注入。在构造函数中,确保将DataContext设置为传入的ViewModel。

<强> 4 即可。最后,确保您的ViewModel实现了INavigationAware接口......这是一个非常简单的简单实现(UniqueID是ViewModel上的一个属性):

    public virtual bool IsNavigationTarget(NavigationContext navigationContext)
    {
        if (navigationContext.Parameters != null)
            return (navigationContext.Parameters["UniqueID"] == UniqueID);

        return false;
    }

    public virtual void OnNavigatedFrom(NavigationContext navigationContext)
    {
    }

    public virtual void OnNavigatedTo(NavigationContext navigationContext)
    {
        if (navigationContext.Parameters != null)
            UniqueID = navigationContext.Parameters["UniqueID"];
    }

从这里开始,Prism将确保只存在一个“UniqueID”视图,同时允许其他具有相同视图的视图,但允许不同的ViewModel(或该ViewModel的数据,即查看不同选项卡中的两个用户,但两者都是使用相同的模板化视图。)