我正在尝试创建一个类似于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);
然而,即使我注册了该视图,该视图仍然永远不会注册...我想我可能做错了 - 是否有其他方法可以做到这一点? (回复:正确的方式)
答案 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的数据,即查看不同选项卡中的两个用户,但两者都是使用相同的模板化视图。)