2009-11-05 3 views
2

J'ai implémenté la navigation dans mon application en utilisant un contrôle Menu qui publie un événement en utilisant EventAggregator en cliquant sur l'élément de menu. Quelque chose comme indiqué ci-dessous,Quelle est la meilleure méthode pour charger des vues dynamiquement à partir d'un contrôle de navigation dans Prism

this.eventAggregator.GetEvent<ViewRequestedEvent>() 
        .Publish(new BusinessObject.Model.MenuModel 
        { 
         Module = "Dashboard", 
         PresenterClass = "DashboardViewModel" 
        }); 

La plupart des modules de mon application sont abonnés à cet événement. Ils utilisent un filtre pour vous inscrire uniquement les événements pertinents au module

this.eventAggregator.GetEvent<ViewRequestedEvent>() 
      .Subscribe(LoadViewRequest, ThreadOption.UIThread, true, i => i.Module == "Dashboard"); 

Demande de vue est traitée comme ceci:

private void LoadRequestedView(MenuModel menuItem) 
{ 
    try 
    { 
     IDashboardViewModel viewModel = this.container.Resolve(Type.GetType(menuItem.PresenterClass)) as IDashboardViewModel; 
     this.regionManager.Regions["ViewRegion"].Add(viewModel.View); 
     this.regionManager.Regions["ViewRegion"].Activate(viewModel.View); 
     this.eventAggregator.GetEvent<ViewNotificationEvent>().Publish(menuItem.Description); 
    } 
    catch (ResolutionFailedException) { } 
} 

Quelle note donneriez-vous cette mise en œuvre? Si vous pensez que ça craint, aidez-moi à l'améliorer ou à suggérer une meilleure alternative.

Répondre

0

Je pense que vous avez un certain manque de séparation des préoccupations avec ce modèle. J'essaie généralement de garder la présentation au Shell. Voir cette question pour savoir comment je l'implémenterais. Il simplifie les choses et résume l'idée d'un RegionalManager loin des modules:

Integrating Modules with Application in Prism aka CompositeWpf