2010-12-13 44 views
2

Je travaille dans un projet où j'ai déclaré deux sections dans le shell; l'un d'eux est utilisé pour placer un menu dont les éléments chargeront les modules à la demande et l'autre sera utilisé pour charger les Vues des modules demandés.Prism v4/MVVM (Unity/WPF) - Charger des modules dans la même région

Voici un exemple de la conception Shell

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

Comme vous pouvez le voir le « Menu » est composé par série de bouton (ce qui est seulement pour le test) et un ContentControl qui fonctionne comme une région où j'ai besoin charger les vues.

Voici un exemple de la façon dont on ajoute les modules dans mon Bootstraper:

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

    } 

Ceci est la méthode Initialize des modules:

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

    } 

Et finallly voici comment le module est appelé à partir du menu.

private void User_Click(object sender, RoutedEventArgs e) 
    { 
     moduleManager.LoadModule("UserModule"); 
    } 

Le problème est que seule la première vue appelée est affichée dans la région. J'utilise Prism 4 et l'unité comme la dépendance conteneur d'injection

Merci pour votre aide

Répondre

2

ContentControl ne peut contenir qu'un seul élément, utilisez ItemsControl si vous souhaitez que plusieurs éléments à afficher dans la même région.

LoadModule(String) n'appellera qu'une seule fois la méthode IModule.Initialize() et l'activera à ce moment-là. Gardez à l'esprit que les modules de chargement et les modules de visualisation ne sont pas identiques. Par conséquent, si vous appelez de nouveau LoadModule(String), les vues ne seront pas activées. Un module et une vue ne sont pas des relations 1: 1. Un module peut avoir plusieurs vues associées.

Ce que vous pouvez faire est plutôt appeler

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

... où T est une instance de la vue que vous souhaitez afficher.

+0

Ok mais quand j'utilise ItemsControl tous les modules sont affichés dans la même région, je veux qu'un seul module soit affiché à la fois. Merci pour votre réponse – mascab

+0

@mascab Ok, gardez le ContentControl et vérifiez les détails ci-dessus ... –