2011-11-23 4 views
1

J'ai (très) récemment commencé à étudier Prism (pour une application WPF) et j'ai travaillé sur une petite application de démonstration pour mon équipe. Ma question est plutôt générale mais je ne trouve pas un exemple simple pour me diriger:
En supposant que j'ai le Shell (dans le module principal), et que le Shell ait une région qui devrait être remplie par un contenu d'un autre module (BTW, est-ce une bonne idée?).
Comment cela se produit-il exactement? Qui est responsable de l'ajout de la vue de l'autre module dans la région désignée du Shell? Quand le modèle de vue pertinent de l'autre module est-il initialisé? Des exemples de code/liens vers eux seraient appréciés.Prism, MVVM et modularité

Merci!

Modifier: Division des questions, voir the new question.

+0

Veuillez partager votre question. Les parties ajoutées devraient aller dans leur propre question. Sinon, ça devient moche ici. – PVitt

+0

Vous avez raison, c'est fini. – Noich

Répondre

1

Oui, séparer la coque et les vues est une bonne idée.

Le gestionnaire de régions est responsable de l'ajout de la vue dans les régions. Par conséquent, vous enregistrez la région dans RegionManager et vous enregistrez la vue dans RegionManager.

A l'intérieur de la coque, vous finirez avec quelque chose comme:

<Window xmlns:Regions="clr-namespace:Microsoft.Practices.Prism.Regions;assembly=Microsoft.Practices.Prism" 
     xmlns:Inf="clr-namespace:YourNamespace.Infrastructure;assembly=YourNamespaceInfrastructure"> 
    <Grid> 
     <ContentControl 
      Regions:RegionManager.RegionName="{x:Static Inf:RegionNames.MainRegion}"/> 
    </Grid> 
</Window> 

Maintenant, vous devez vous inscrire en vue de la région, il résidera dans:

public class FirstModule : IModule 
{ 
    public void Initialize() 
    { 
     RegionManager.RegisterViewWithRegion(RegionNames.MainRegion, 
      typeof(MainView)); 
     RegionManager.RegisterViewWithRegion(RegionNames.SecondRegion, 
      () => Container.Resolve<ISomethingViewModel>().View); 
    } 
} 

Le code exemple montre les deux types des inscriptions. Le premier est pour la première approche, le second pour le premier modèle.

[EDIT]

Les noms de région sont définis dans une classe statique dans le module d'infrastructure:

namespace YourNamespace.Infrastructure 
{ 
    public static class RegionNames 
    { 
     public const string MainRegion = "MainRegion"; 
     //... 
    } 
} 

[/ EDIT]

+0

Merci! Voulez-vous dire définir les noms des régions dans le projet d'infrastructure? Cela a beaucoup plus de sens que de faire connaître par magie à mon module le nom de sa région, mais je ne sais pas exactement comment vous l'avez fait. – Noich

+0

@Noich Oui, les noms de région résident dans une classe statique dans mon assembly infrastructure. Jetez un oeil à la réponse mise à jour. – PVitt

+0

Merci encore.S'il vous plaît voir les 2 modifications à mon message original pour d'autres questions et clarifications. J'apprécierais votre aide. – Noich

2

Dans votre bootstrapper vous définiriez un catalogue de modules (remplaçant CreateModuleCatalog) qui répertorie les modules qui seront utilisés dans votre application. Chaque module a une classe implémentant IModule qui contient une méthode Initialize qui est appelée lors de la création du module. Au sein de ce que vous définissez ce qui doit être ajouté à la région sur la coque:

public void Initialize() 
    { 
     RegisterViewsAndServices(); //Method to register dependencies 
     IMyViewModel model = _container.Resolve<IMyViewModel>(); 
     _regionManager.Regions[RegionNames.ShellHeaderRegion].Add(model); 
    } 

Ici, j'ai ajouté un viewmodel à la coquille et j'ai un dictionnaire de ressources définies en dehors qui détermine ce point de vue devrait lui être appliqué via un DataTemplate.

La documentation Prism (en particulier le chapitre 2) contient de nombreuses informations utiles à ce sujet. http://msdn.microsoft.com/en-us/library/gg406140.aspx

Questions connexes