2017-05-04 6 views
0

Ich benutze Prismenregionen, um dynamische TabControl zu erstellen. Aber ich habe ein Problem mit der Übergabe des Objekts von TabItem (übergeordnete Ansicht) an seine untergeordneten Regionen. Das Folgende ist der Code, den ich verwende, um das TabControl zu erstellen.TabControl-Region, Wie Parameter an untergeordnete Region übergeben? WPF - Prism

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); 

Project:

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; 
} 

Hinweis: Bitte beachten Sie, dass im letzten Teil des Codes innerhalb des ProjectExplorerView.xaml.cs der Ansicht Konstruktor wird mehrere Male jedes Mal neue Tab erstellt genannt. Beim Verfolgen des Codes wird die Kontextvariable manchmal null und hat manchmal den richtigen Wert, der das Projekt ist, das ich weitergeben möchte. aber es ist immer Null am Ende des Aufrufs des Konstruktors.

Antwort

0

Also ich bin mir nicht sicher, ob dies der richtige Weg ist, aber es funktioniert. Zuerst habe ich regionManager.RegisterViewWithRegion("ProjectExplorerRegion", typeof(ProjectExplorerView)); von ProjectViewModel zu ShellViewModel entfernt, dies führte dazu, dass die Ansicht mehrmals aufgerufen wurde, wie ich am Ende meiner Frage erwähnt habe.

Zweite Aktualisierung der ParentProjectInfo Implementierung zu verwenden INotifyPropertyChanged, und in der Eigenschaft Setter, zu aktualisieren, was automatisch aktualisiert werden muss.

Verwandte Themen