4 votes

Prism : Comment injecter une instance de modèle de vue dans une région ?

Après plusieurs semaines d'utilisation de Prism, je suis passé par toutes les méthodes de navigation. Mais il y a encore une chose que je n'ai pas été capable de réaliser avec Prism "out-of-the-box" : naviguer vers une instance de modèle de vue. Il est très facile de naviguer vers un modèle de vue ou une vue type mais il n'y a en fait aucun moyen de naviguer vers un modèle de vue réel instance .

Par exemple, lorsque j'ai une liste de différentes instances de modèle de vue (de différents types également), si l'une d'entre elles est sélectionnée et que je veux l'afficher dans ma région de contenu, je ne peux pas le faire à moins de publier le changement par le biais de l'agrégation d'événements et je ne veux pas cela parce que cela me bloque à un seul type de vue dans ma région de contenu. Ce que je veux faire, c'est enregistrer une instance vue-modèle dans une région, afin que la vue puisse se charger dynamiquement à partir de modèles de données.

En fait, j'ai réussi à faire cela en créant un RegisterViewModelWithRegion comme méthode d'extension de RegionManager, cela fonctionne bien mais ce n'est pas très net car je dois chercher manuellement dans les ressources de mon application, charger la vue, attacher mon instance de modèle de vue et ensuite ajouter la vue à ma région.

J'ai vraiment l'impression de passer à côté de quelque chose dans l'architecture car ce type de pratique me semble évident mais apparemment je ne trouve personne qui ait la même préoccupation.

Votre aide et votre expérience seraient très appréciées. Merci de votre aide et de votre expérience.

5voto

Ucodia Points 1977

Après quelques discussions avec l'équipe de Prism, j'ai découvert qu'en fait, l'utilisation de l'option Region.Add(object view) pour injecter un modèle de vue dans une région est tout à fait acceptable. Elle donnera exactement le même résultat (à quelques exceptions près).

J'ai inspecté le Adaptateur ItemsControlRegion et tout ce qu'il fait en fin de compte, c'est

regionTarget.ItemsSource = region.Views;

regionTarget étant le contrôle cible ( ListBox par exemple) et region.Views étant les objets que vous injectez dans vos régions.

Bien sûr, merci pour votre aide Rachel :-)

2voto

Rachel Points 49408

Jetez un coup d'œil à cet article J'ai écrit sur l'utilisation de la navigation avec MVVM

Vous avez besoin d'un ViewModel pour votre shell d'application qui définit les ViewModel est le CurrentPage . Pour changer de modèle de vue, il suffit de déclencher un événement que l'interpréteur de commandes récupérera pour définir le modèle de vue. CurrentPage à n'importe quel ViewModel en cours.

Il est possible de changer de page avec ce type d'outil grâce à PRISM :

eventAggregator.GetEvent<ChangePageEvent>()
    .Publish(new ChangePageEventArgs(this));

Je suis sûr qu'il y a d'autres façons d'y parvenir, mais jusqu'à présent, je trouve que cette méthode est la plus simple.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X