2017-05-04 97 views
0

我使用棱鏡區域來創建動態TabControl。但我在將對象從TabItem(父視圖)傳遞到其子區域時遇到問題。 以下是我用來構建TabControl的代碼。TabControl區域,如何將參數傳遞給子區域? WPF - 棱鏡

外殼:

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視圖構造函數中的代碼被調用多次,每次新的選項卡被創建。當跟蹤代碼時,上下文變量有時會得到空值,有時候會有正確的值,這是我想要傳遞的項目。但在調用構造函數結束時它始終爲空。

回答

0

所以我不確定這是否是正確的方式來做到這一點,但它的工作原理。 首先,我已將regionManager.RegisterViewWithRegion("ProjectExplorerRegion", typeof(ProjectExplorerView));ProjectViewModel刪除爲ShellViewModel,這導致視圖被多次調用,正如我在問題結尾處提到的那樣。

第二次更新ParentProjectInfo執行使用INotifyPropertyChanged,並在屬性設置器內更新需要自動更新的內容。