Question

Je suis en utilisant le framework MVVM Light ainsi que l'Unité de DI.J'ai quelques Vues imbriquées, chacune reliée à un correspondant ViewModel.Le Viewmodel sont liés à chaque Affichage de la racine de contrôle DataContext via le ViewModelLocator idée que Laurent Bugnion a mis en MVVM Light.Cela permet de trouver des ViewModels via une ressource statique et pour le contrôle de la durée de vie des ViewModels via une Injection de Dépendance cadre, dans ce cas l'Unité.Il permet aussi l'Expression Blend pour tout voir en ce qui concerne Viewmodel et comment les lier.

Comme je l'ai dit les points de Vue ont une bonne dose de nidification, mais le Viewmodel ne savons rien au sujet de chaque d'autres.Une vue parent se lie à son correspondant ViewModel via la ressource statique ViewModelLocator (qui utilise l'Unité de contrôle de la construction et de la durée de vie du ViewModel objet).Que la vue parent contient un contrôle utilisateur dans ce qui est un autre sous-vue, qui va alors et obtient son correspondant ViewModel via le ViewModelLocator ainsi.Le Viewmodel n'ont pas de références à l'autre ou savons tout de la hiérarchie à l'égard les uns des autres.

Voici donc un exemple de la façon dont le Viewmodel faire interagir par le biais de la messagerie.J'ai un parent qui a un ComboBox lié aux données à une ObservableCollection dans son ViewModel.La zone de liste déroulante du SelectedItem est aussi lié dans les deux sens) à une propriété du ViewModel.Lors de la sélection de la zone de liste déroulante des changements, c'est pour déclencher les mises à jour dans d'autres points de Vue et les sous-Vues.Actuellement, je suis à l'accomplissement de cette via le système de Messagerie qui se trouve dans MVVM Light.

Alors je me demandais quelle est la meilleure pratique serait d'obtenir des informations à partir d'un ViewModel à l'autre?Dans ce cas, ce que j'ai besoin de passer à la sous-Viewmodel est fondamentalement un utilisateur Guid représentant l'utilisateur actuellement connecté.Le haut de la Vue parent (bien, ViewModel) permettra de connaître cette information, mais je ne suis pas sûr de la façon de le faire descendre dans le sous-Viewmodel.

Quelques approches possibles, que je pense:

  • Si le sous-ViewModel demander à l' ressource statique ViewModelLocator pour une référence à l'objet même de la Vue parent est l'utilisation et l'accès à l' la propriété de cette façon?Il semble que ViewModels en passant par chacun des autres propriétés n'est pas très propre et les couples ensemble inutilement.

  • Je suis déjà en utilisant la messagerie de notifier les sous-points de Vue que l'utilisateur a sélectionné un nouvel élément dans la zone de liste déroulante et à mise à jour en conséquence.Mais l'objet le type qui est choisie dans le Zone de liste déroulante n'est pas vraiment directement par rapport à ces données de la valeur que l' les sous-Vues de besoin.

Était-ce utile?

La solution 2

J'ai décidé d'avoir les sous-Viewmodel publier un message demandant les informations nécessaires et ensuite le parent VM s'abonner à ce type de message et le jeton de clé.Je ne veux pas abuser de ce moyen de communication, mais je pense que ça va être efficace pour quelques morceaux de données que je vais avoir du mal à trouver des façons de pousser vers le bas à travers le point de Vue de la hiérarchie.Jusqu'à ce point, la plupart des données en passant, a été en réponse à des événements, mais pas chaque morceau de données peut être passé autour de cette façon, surtout si les données sont acquises ou de l'événement qui se passe sur un autre écran avant que le nouveau point de vue est encore construit et de la lecture pour recevoir les données.

J'ai eu une conversation sur twitter avec quelques noms bien connus dans cet espace (Glenn Bloc, John Papa, et Rob Eisenberg).Ils ont suggéré un certain nombre de choses comme un Modèle Visiteur, mais je n'étais pas sûr que cela fonctionne sans hiérarchie des machines virtuelles.Ce pourrait être parce que mon design a été à peu près de la Vue-tout d'abord, par opposition à un ViewModel-première approche.Une autre suggestion qui peut avoir été viable consisterait à modifier mon ViewModelLocator Injection de Dépendance et de les utiliser pour inclure la possibilité de passer dans les valeurs de données pour le sous-VMs au moment de la création.J'ai eu un peu de mal à envisager en raison de la nature statique de la VML, et a décidé à la demande de message solution je suis venu avec serait plus simple et simple pour le moment.Je vais probablement avoir à repenser la solution si il finit par être trop beaucoup plus de données entrant dans cette situation.

Autres conseils

J'ai vu essentiellement deux approches.Pour le général de la croix-VM communication de l'événement agrégateur modèle fonctionne très bien.

Pour les hiérarchies de VMs toutefois, l'utilisation d'un modèle Visiteur peut-être mieux.Avec un visiteur, vous pouvez avoir l'information qui circule à travers la hiérarchie par exemple donner à chaque enfant une référence à la société mère VM automatiquement.

Vous pouvez aussi le faire avec d'EA, mais le défi est là pour passer suffisamment d'informations dans le corps du message, tels que les enfants savent que c'est quelque chose qu'ils devraient s'inquiéter.

Aussi loin que VM locator, absolument pas!La VM localisateur de choses est strictement pour la liaison de l'INTERFACE utilisateur, il ne doit pas la surface de lui-même, en dehors de ce contexte (de façon optimale).

My $.02 Glenn

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