0

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

到目前为止,除了内容之外,我已经完成了所有工作。我的目标是,当用户双击侧面导航菜单中的项目时,它会在内容区域中打开文档。这行得通,但每次我双击它都会产生同一个视图的一个实例。我有可能在 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);

但是,即使我注册了该视图,它似乎也从未注册过……我想我可能做错了——还有其他方法吗?(回复:正确的方式)

4

1 回答 1

0

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

我最终做的是导航:

1 . 在导航菜单中,使用我要显示的视图的 UniqueID(保证是唯一的)构造一个 UriQuery(包含在 Prism 中)并将其添加到我要导航到的视图中,即:

    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 的数据,即在不同选项卡中查看两个用户,但都使用相同模板视图)。

于 2012-05-15T18:18:46.333 回答