2010-12-13 5 views
2

Ich arbeite in einem Projekt, wo ich zwei Abschnitte in der Shell deklariert habe; Eine davon wird verwendet, um ein Menü zu platzieren, dessen Elemente Module bei Bedarf laden, und das andere wird verwendet, um die Ansichten der angeforderten Module zu laden.Prism v4/MVVM (Unity/WPF) - Laden Sie Module in die gleiche Region

Dies ist ein Beispiel für die Shell-Design

<StackPanel Orientation="Vertical" Grid.Column="0" Grid.Row="1"> 
     <Button Content="Home" Height="23" Name="Home" Width="75"/> 
     <Button Content="Users" Height="23" Name="Users" Width="75"/> 
    </StackPanel> 
    <Border Grid.Column="1" Grid.Row="1" Background="WhiteSmoke"> 
     <ContentControl cal:RegionManager.RegionName="MainRegion" Name="MainRegion"/> 
    </Border> 

Wie Sie die „Menu“ sehen durch Taste Serie besteht (dies ist nur für Test) und einem Contentcontrol, die wie eine Region arbeitet, wo ich um die Ansichten zu laden.

Dies ist ein Beispiel dafür, wie sich die Module in meinem Bootstraper hinzugefügt:

protected override void ConfigureModuleCatalog() 
    { 
     base.ConfigureModuleCatalog(); 

     System.Type homeModule = typeof(FieldCollection.Home.HomeModule); 
     ModuleCatalog moduleCatalog = (ModuleCatalog)this.ModuleCatalog; 
     moduleCatalog.AddModule(new ModuleInfo() { ModuleName = homeModule.Name, ModuleType = homeModule.AssemblyQualifiedName, InitializationMode = InitializationMode.OnDemand }); 

     System.Type userModule = typeof(FieldCollection.User.UserModule); 
     moduleCatalog.AddModule(new ModuleInfo() { ModuleName = userModule.Name, ModuleType = userModule.AssemblyQualifiedName, InitializationMode = InitializationMode.OnDemand }); 

    } 

Dies ist die Initialize-Methode der Module:

public void Initialize() 
    { 
     this.container.RegisterType<IUserController, UserController>(new ContainerControlledLifetimeManager()); 
     this.regionManager.RegisterViewWithRegion("MainRegion", typeof(Views.UserSummaryView)); 

    } 

Und SCHLIESSLICH das ist, wie das Modul genannt wird von der Speisekarte.

Das Problem ist, dass nur die erste aufgerufene Ansicht in der Region angezeigt wird. Ich bin mit Prism 4 und Unity wie Dependency Injection Container

Danke für Ihre Hilfe

Antwort

2

ContentControl nur ein Element enthalten können, verwenden ItemsControl wenn Sie mehrere Elemente wollen innerhalb der gleichen Region angezeigt werden soll.

LoadModule(String) wird die IModule.Initialize() Methode des Moduls nur einmal aufrufen und an diesem Punkt aktivieren. Beachten Sie, dass Lademodule und Anzeigemodule nicht identisch sind. Wenn Sie also erneut LoadModule(String) aufrufen, werden die Ansichten nicht aktiviert. Ein Modul und eine Sicht sind keine 1: 1-Beziehungen. Einem Modul können mehrere Ansichten zugeordnet sein.

Was könnten Sie stattdessen tun ist

IRegionManager.Regions["MainRegion"].Activate(T); 

nennen ... wo T ist eine Instanz der Ansicht, die Sie anzeigen möchten.

+0

Ok, aber wenn ich ItemsControl verwende, werden alle Module in der gleichen Region angezeigt, ich möchte nur ein Modul gleichzeitig anzeigen. Vielen Dank für Ihre Antwort – mascab

+0

@mascab Ok halten Sie das ContentControl dann und überprüfen Sie die oben genannten Details ... –

Verwandte Themen