TabControl 区域,如何将参数传递给子区域? WPF-棱镜
TabControl region, How to pass parameter to child region? WPF - Prism
我正在使用棱镜区域来创建动态 TabControl
。但是我在将对象从 TabItem
(父视图)传递到其子区域时遇到问题。
下面是我用来构建 TabControl 的代码。
Shell:
xaml
<ContentControl regions:RegionManager.RegionName="ShellProjectRegion" />
ShellViewModel
regionManager.RegisterViewWithRegion(ShellProjectRegion, typeof(ProjectTabView));
ProjectTabView:
xaml
<TabControl regions:RegionManager.RegionName="ProjectTabRegion">
ProjectTabViewModel
container.RegisterType<object, ProjectView>(typeof(ProjectView).FullName);
ProjectView:
xaml
<Grid>
<ContentControl regions:RegionManager.RegionName="ProjectExplorerRegion"
regions:RegionManager.RegionContext="{Binding}" />
</Grid>
ProjectViewModel
public class ProjectViewModel : BindableBase, INavigationAware, IActiveAware {
private ProjectItem _project;
public ProjectItem Project {
get { return _project; }
set { SetProperty(ref _project, value); }
}
public ProjectViewModel(IRegionManager regionManager) {
regionManager.RegisterViewWithRegion("ProjectExplorerRegion", typeof(ProjectExplorerView));
}
public void OnNavigatedTo(NavigationContext navigationContext) {
Project = (ProjectItem)navigationContext.Parameters["project"];
}
}
ProjectExplorerView:
xaml.cs
public ProjectExplorerView(IUnityContainer container) {
InitializeComponent();
var vm = container.Resolve<ProjectExplorerViewModel>();
RegionContext.GetObservableContext(this).PropertyChanged += (s, e) => {
var context = (ObservableObject<object>)s;
var projectVm = (ProjectViewModel)context.Value;
vm.ParentProjectInfo = projectVm.Project.ProjectInfo;
};
DataContext = vm;
}
注意:请注意,在 ProjectExplorerView.xaml.cs
中的最后一段代码中,每次创建新选项卡时都会多次调用视图构造函数。跟踪代码的时候,context变量有时是null,有时是正确的值,这就是我要pass的项目。但在调用构造函数结束时它始终为 null。
所以我不确定这是否是正确的方法,但它确实有效。
首先,我将 regionManager.RegisterViewWithRegion("ProjectExplorerRegion", typeof(ProjectExplorerView));
从 ProjectViewModel
删除到 ShellViewModel
,这导致视图被多次调用,正如我在问题末尾提到的那样。
第二次更新 ParentProjectInfo
实现以使用 INotifyPropertyChanged
,并在 属性 setter 中更新需要自动更新的内容。
我正在使用棱镜区域来创建动态 TabControl
。但是我在将对象从 TabItem
(父视图)传递到其子区域时遇到问题。
下面是我用来构建 TabControl 的代码。
Shell:
xaml
<ContentControl regions:RegionManager.RegionName="ShellProjectRegion" />
ShellViewModel
regionManager.RegisterViewWithRegion(ShellProjectRegion, typeof(ProjectTabView));
ProjectTabView:
xaml
<TabControl regions:RegionManager.RegionName="ProjectTabRegion">
ProjectTabViewModel
container.RegisterType<object, ProjectView>(typeof(ProjectView).FullName);
ProjectView:
xaml
<Grid>
<ContentControl regions:RegionManager.RegionName="ProjectExplorerRegion"
regions:RegionManager.RegionContext="{Binding}" />
</Grid>
ProjectViewModel
public class ProjectViewModel : BindableBase, INavigationAware, IActiveAware {
private ProjectItem _project;
public ProjectItem Project {
get { return _project; }
set { SetProperty(ref _project, value); }
}
public ProjectViewModel(IRegionManager regionManager) {
regionManager.RegisterViewWithRegion("ProjectExplorerRegion", typeof(ProjectExplorerView));
}
public void OnNavigatedTo(NavigationContext navigationContext) {
Project = (ProjectItem)navigationContext.Parameters["project"];
}
}
ProjectExplorerView:
xaml.cs
public ProjectExplorerView(IUnityContainer container) {
InitializeComponent();
var vm = container.Resolve<ProjectExplorerViewModel>();
RegionContext.GetObservableContext(this).PropertyChanged += (s, e) => {
var context = (ObservableObject<object>)s;
var projectVm = (ProjectViewModel)context.Value;
vm.ParentProjectInfo = projectVm.Project.ProjectInfo;
};
DataContext = vm;
}
注意:请注意,在 ProjectExplorerView.xaml.cs
中的最后一段代码中,每次创建新选项卡时都会多次调用视图构造函数。跟踪代码的时候,context变量有时是null,有时是正确的值,这就是我要pass的项目。但在调用构造函数结束时它始终为 null。
所以我不确定这是否是正确的方法,但它确实有效。
首先,我将 regionManager.RegisterViewWithRegion("ProjectExplorerRegion", typeof(ProjectExplorerView));
从 ProjectViewModel
删除到 ShellViewModel
,这导致视图被多次调用,正如我在问题末尾提到的那样。
第二次更新 ParentProjectInfo
实现以使用 INotifyPropertyChanged
,并在 属性 setter 中更新需要自动更新的内容。