TabControl区域,如何将参数传递给子区域? WPF - 棱镜

时间:2017-05-04 11:15:26

标签: wpf xaml prism tabcontrol region

我使用棱镜区域来创建动态TabControl。但是我在将对象从TabItem(父视图)传递到其子区域时遇到问题。 以下是我用来构建TabControl的代码。

  

贝壳:

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内的最后一段代码中,每次创建新Tab时,都会多次调用视图构造函数。在跟踪代码时,上下文变量有时会变为null,有时会有正确的值,这是我想要传递的项目。但是在调用构造函数结束时,它总是为空。

1 个答案:

答案 0 :(得分:0)

所以我不确定这是否是正确的方法,但它确实有效。 首先,我已将regionManager.RegisterViewWithRegion("ProjectExplorerRegion", typeof(ProjectExplorerView));ProjectViewModel移至ShellViewModel,这导致视图被多次调用,正如我在问题末尾提到的那样。

第二次更新ParentProjectInfo实现以使用INotifyPropertyChanged,并在属性设置器中更新需要自动更新的内容。