2010-10-18 3 views
3

Righty oh maintenant je crois que ive mis cette application à droite mais corrigez-moi si je me trompe, pour l'amour simple j'ai dans mon bootstrapper 3 modules chargés, l'un est une navigation module, et deux autres les vues.Les événements ne tirez pas à travers les modules (prisme, MVVM, Silverlight C#)

Indépendamment du code si je charge les modules et dans la méthode d'initialisation, ajoutez-les à une région qui fonctionne très bien, mais d'un certain contrôle.

Maintenant, dans le modèle de vue de la navigation i ont un agrégateur d'événement qui publie un événement (classe qui hérite de EventArgs si c'est important) les deux autres modules ont souscrit à cet événement, mais ni le recevoir,

/// <summary> 
    /// Carries the out menu item selection methods. 
    /// </summary> 
    /// <param name="e">The <see cref="TMBL.Web.TMBLCore.Controls.Assets.NavigationViewSelectionEventArgs"/> instance containing the event data.</param> 
    public void CarryOutMenuItemSelectionMethods(NavigationViewSelectionEventArgs e) 
    { 
     _eventAggregator.GetEvent<NavigationMenuItemSelectedEvent>().Publish(e); 
    } 

dans la navigation ViewModel, puis souscrits dans le module de nouvelles

_eventAggregator.GetEvent<NavigationMenuItemSelectedEvent>().Subscribe(NavigationMenuReturnedEvent, 
                       ThreadOption.UIThread); 

Semblait assez simple, je peux souscrire à cet événement dans mon module de navigation et il capte, il suffit d'aller wont l'extérieur du module, ce qui fait un besoin faire pour y parvenir?

L'agrégateur d'événements est également injecté dans le constructeur de modules via l'injection de dépendances, puis stocké et transmis via des constructeurs aux modèles viewsand view (voir d'abord les vues). Alors que im ici, je ne sais pas si cela est la cause du problème ou non, mais est-ce mal d'avoir le magasin de modules d'une instance de aggrégateur de l'événement et le transmettre de cette façon, par exemple

_displayNewsView = new DisplayNewsView(new DisplayNewsViewModel(_eventAggregator)); 

Ou si l'agrégateur d'événements se aux viewmodels d'une manière différente?

Merci pour votre temps

Répondre

3

vous injectez correctement l'aggrégateur d'événement, mais il y a quelques choses que vous devez vérifier.

1) L'instance d'agrégateur d'événements est-elle globale à l'application et non créée par chaque module? La même instance doit être utilisée entre les modules. Cela devrait être créé dans l'application bootstrapper et transmis à chaque module.

2) L'option NavigationMenuItemSelectionEvent est-elle définie dans un assembly commun partagé entre les modules? Si tel est le cas (comme je m'y attendais), alors assurez-vous que le même assemblage est utilisé entre les modules. Vous pouvez vérifier cela lorsque vous chargez l'application à l'aide du débogueur et affichez les assemblys chargés en utilisant la fenêtre Modules (menu Debug> Windows). L'assemblage ne devrait être listé qu'une seule fois.

Si vous voyez que l'assembly commun est chargé plusieurs fois, il se peut que vous chargiez des modules de différents répertoires et que l'assembly commun ne soit PAS signé. .Net les traitera comme séparés et par conséquent le type NavigationMenuItemSelectionEvent ne correspondra pas. Soit l'assemblage signé s'assurant que tous les modules utilisent la même instance de l'assemblage ou s'assurer que tous les modules sont chargés depuis le même répertoire (y compris l'application si elle utilise aussi l'assemblage commun).

1

Okay débordement de pile a perdu ma belle grande réponse. J'ai donc besoin d'une instance d'agrégateur d'événements dans mon programme d'amorçage car tous les modules doivent utiliser le même service, cela me semble logique. Cependant, je pensais que l'injection de dépendance prendrait soin de cela, j'ai besoin d'une instance de l'agrégateur d'événements dans mon bootstrapper?mon problème avec ceci est deux fois comment l'installer

protected override DependencyObject CreateShell() 
    { 
     _eventAggregator = new EventAggregator(); 
     var shell = Container.Resolve<Shell>(); 
     Application.Current.RootVisual = shell; 
     return shell; 
    } 

Cela fonctionnerait-il? D'autre part, comment puis-je passer cette instance à mes modules dans le strapper de démarrage au moment où ils sont créés lorsqu'ils sont ajoutés au catalogue des modules je crois

protected override IModuleCatalog GetModuleCatalog() 
    { 
     var catalog = new ModuleCatalog(); 
     catalog.AddModule(typeof(TMBLCoreModule), InitializationMode.WhenAvailable); 
     catalog.AddModule(typeof(NewsModule), InitializationMode.WhenAvailable); 
     catalog.AddModule(typeof(UserModule), InitializationMode.WhenAvailable); 
     return catalog; 
    } 

Comment puis-je passer alors l'aggrégateur de l'événement dans chaque module. J'ai eu un rapide google mais je n'ai pas encore trouvé cette information, désolé pour mon ignorance

+0

Okay j'ai réussi à le retrouver après quelques tentatives ratées, quand j'ai enregistré l'instance de l'agrégateur d'événements que j'avais pour le dire, traitez-le comme un singleton Container.RegisterType (nouveau ContainerControlledLifetimeManager()); http://blogs.msdn.com/b/francischeung/archive/2008/06/02/decoupled-communication-with-prism-event-aggregation.aspx – Lee

+0

Aussi désolé stackoverflow m'a signé dans un compte temporaire plutôt que le mien et Je ne peux pas savoir comment y revenir pour accepter votre réponse, les excuses, merci beaucoup – Lee

+0

email [email protected] et ils devraient être en mesure de fusionner les 2 comptes. – aqwert

Questions connexes