Question

Je construis une application qui est basée sur MVVM Light. Je suis dans le besoin de créer plusieurs instances de la même vue, et chacun doit se lier à son propre ViewModel.

Les ViewModelLocator par défaut implémente ViewModels comme singletons, donc des cas différents de la même vue se lie à la même ViewModel.

Je pourrais créer le ViewModel dans le VMLocator comme un objet non statique (aussi simple que le retour nouvelle machine virtuelle () ...), mais qui me aiderais que partiellement. En fait, je dois encore garder une trace des fenêtres ouvertes. Néanmoins, chaque fenêtre peut ouvrir plusieurs autres fenêtres (d'un autre genre, cependant). Dans cette situation, je pourrais avoir besoin d'exécuter une opération sur le parent Voir et tous ses enfants. Par exemple avant de fermer la vue P, je pourrais vouloir fermer tous ses enfants (vue C1, C2 vue, etc.).

Par conséquent, est-il un moyen simple et facile d'y parvenir? Ou est-il une meilleure pratique, vous me conseiller à suivre?

Merci d'avance pour votre aide précieuse.

Cheers,
Gianluca.

Était-ce utile?

La solution

Il n'y a pas d'obligation de stocker les ViewModels comme singletons dans le ViewModelLocator, mais il les rend certainement plus facile de trouver si la vue est un singleton trop . De toute évidence, si vous avez plusieurs instances de la même classe View, vous aurez plusieurs instances de la même classe ViewModel, et il ne peut pas être un singleton plus.

Pour garder une trace des multiples instances du ViewModel, vous pouvez mettre en œuvre un dictionnaire dans le ViewModelLocator qui recherche pour un ViewModel selon une clé. La clé peut être un identifiant unique pour la vue, par exemple. Une fois que vous obtenez la main sur la vue, récupérer sa clé, puis récupérer le viewmodel du localisateur.

Mise à jour : Souvent, vous ne même pas besoin de suivre plusieurs viewmodels. Par exemple, vous pouvez avoir la classe Messenger envoyer un message à toutes les instances d'une classe viewmodel donnée à l'aide de la surcharge d'envoi. Donc, avant de mettre en œuvre un dictionnaire pour garder une trace des machines virtuelles, demandez-vous si vous avez vraiment besoin! ;)

Hope qui aide, Laurent

Autres conseils

I a utilisé le système de nommage du conteneur d'unité.

Voir " Comment distinguer les paires de modèles multiples / Affichage en utilisant conteneur d'unité ».

J'ai eu un problème affiché et résolu dans cette question SO . Il est avéré être très lié à la réponse de M. Bugnion ici (ce qui m'a aidé énormément, je vous remercie!)

Ce que j'ai trouvé est que vous ne avez pas besoin de stocker la propriété vue-modèle ViewModelLocator du tout. Il suffit d'utiliser ServiceLocator pour créer une instance avec une clé, et dans votre « Service de dialogue », passer la clé de ShowDialog<T>(string key = null).

En outre, comme mentionné dans ce fil déjà, la méthode utilisation Messenger.Default.Send et souvenez-vous d'appeler viewModel.Cleanup() après pour désenregistrer la vue modèle de Messenger, empêchant ainsi les modèles de vue-fantôme d'essayer de messages futurs processus envoyés à toutes les instances de la vue- type de classe modèle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top