2009-09-14 6 views
15

Lorsque vous ajoutez des modules à la collection IRegionManger, quelle est la différence entre l'utilisation de IRegion.Add et IRegionManager.RegisterViewWithRegion?Dans Composite WPF (Prism), quelle est la différence entre IRegion.Add et IRegionManager.RegisterViewWithRegion?

IRegion.Add

public void Initialize() 
{ 
    _regionManager.Regions["MainRegion"].Add(new ModuleAView()); 
} 

IRegionManager.RegisterViewWithRegion

public void Initialize() 
{ 
    _regionManager.RegisterViewWithRegion("MainRegion", typeof(ModuleAView)); 
} 

Répondre

15

La différence est de savoir qui est responsibl e pour créer la vue. Dans le scénario IRegion.Add (également appelé View Injection), vous êtes responsable de l'instanciation préalable de la vue. Dans l'autre scénario avec RegisterViewWithRegion (également appelé View Discovery), le gestionnaire de région instancie la vue elle-même.

Il y a des raisons techniques que vous voudriez faire l'un ou l'autre. Par exemple

  • vous aviez un moyen plus compliqué de créer des vues (peut-être que vous voulez créer la vue et son ViewModel et les marier en définissant la propriété DataContext vous), vous aurez besoin d'utiliser View Injection
  • Si vous utilisez Region Scopes, vous serez obligé d'utiliser View Injection.

La Documenation pertinente est: Pour Voir Composition (y compris Voir Injection vs Voir Découverte et discussions de vue première ou View-présentateur-premières approches): http://msdn.microsoft.com/en-us/library/dd458944.aspx

Il y a aussi un très pratique " quand utiliser chaque section. Voici l'extrait de la documentation:

  • contrôle explicite ou programmatique sur lorsqu'une vue est créé et affiché, ou lorsque vous devez supprimer une vue d'une région, pour exemple, en raison de application logique.
  • Pour afficher plusieurs instances des mêmes vues dans une région, où chaque instance de vue est liée à différentes données. Par exemple, si vous voulez ajouter l'affichage à une région de détail spécifique à l'utilisateur pour voir quelle instance d'une région une vue est ajoutée (pour exemple). Notez que ce scénario nécessite tronçons décrits plus loin dans ce rubrique.

Espérons que cela aide.

+0

@ Anderson - votre réponse aide vraiment. Ma compréhension est que IRegion.Add et IRegionManager.RegisterViewWithRegion créent une instance concrète de la vue et l'ajoute immédiatement à IRegionCollection. Certes, je commence juste à prendre pied sur CAG. Pourriez-vous me montrer un exemple avec plus de détails? J'ai parcouru les QuickStarts et HowTos, mais je ne sais pas exactement quand à l'un ou l'autre parce que les échantillons les utilisent dans la méthode Imodule.Initialize et ne semblent pas faire quelque chose de différent dans les exemples. –

+0

Non, la différence est avec Add, vous passez dans une vue déjà instanciée. Avec RegisterViewWithRegion, vous passez soit un type, un délégué, soit un objet (vue instanciée). La plupart du temps, la dernière surcharge n'est pas utilisée. Donnez-moi une seconde et je vous indiquerai au bon endroit dans les Docs. –

+0

Mis à jour avec un lien vers la meilleure ressource dans la documentation et j'ai sorti le verbiage officiel pour savoir quand utiliser l'injection de vue par rapport à la découverte de vue. J'espère que c'est plus clair que ma description. –

2

RegisterViewWithRegion déclenche l'événement OnContentRegistered, mais bien sûr, qui ne pourrait être le cas en fonction de votre DI

+0

Pouvez-vous élaborer? Ce n'est pas clair. –

+0

lorsque vous modifiez directement la propriété avec l'opérateur de support, vous n'obtiendrez pas l'événement déclenché, mais lorsque vous appelez l'autre méthode, vous obtenez à la fois la collection modifiée et un événement qui peut avertir toute personne écoutant – slf

Questions connexes