J'utilise le framework MVVM Light ainsi que Unity for DI. J'ai des Vues imbriquées, liées chacune à un ViewModel correspondant. Les ViewModels sont liés au contrôle racine de chaque vue DataContext via l'idée ViewModelLocator que Laurent Bugnion a placée dans MVVM Light. Cela permet de trouver ViewModels via une ressource statique et de contrôler la durée de vie de ViewModels via une infrastructure d'injection de dépendances, en l'occurrence Unity. Il permet également à Expression Blend de voir tout ce qui concerne ViewModels et comment les lier. Comme je l'ai dit, les vues ont une bonne dose d'imbrication, mais les ViewModels ne savent rien vraiment l'un de l'autre. Une vue parent se lie à son ViewModel correspondant via la ressource statique ViewModelLocator (qui utilise Unity pour contrôler la construction et la durée de vie de l'objet ViewModel). Cette vue parent contient un contrôle utilisateur qui est une autre sous-vue, qui va ensuite et obtient son ViewModel correspondant via le ViewModelLocator ainsi. Les ViewModels n'ont pas de références les uns aux autres ou ne connaissent aucune hiérarchie les uns par rapport aux autres. Voici un exemple de la façon dont ViewModels interagissent via la messagerie. J'ai une vue parent qui a une base de données ComboBox à une ObservableCollection dans son ViewModel. Le SelectedItem de ComboBox est également lié (bidirectionnel) à une propriété sur le ViewModel. Lorsque la sélection de la zone de liste modifiable change, cela déclenche des mises à jour dans d'autres vues et sous-vues. Actuellement, j'accomplis cela via le système de messagerie que l'on trouve dans MVVM Light. Donc, je me demande quelle serait la meilleure pratique pour obtenir des informations d'un ViewModel à l'autre? Dans ce cas, ce que je dois transmettre à sous-ViewModels est fondamentalement un utilisateur Guid représentant l'utilisateur actuellement connecté. Le View parent le plus haut (bien, ViewModel) connaîtra cette information, mais je ne suis pas sûr de savoir comment l'obtenir dans les sous-ViewModels.Passer ou Obtenir une valeur de Parent ViewModel vers Sub-ViewModel?
Certaines approches possibles que je peux penser:
Si le sous-ViewModel demander à la ressource statique ViewModelLocator pour une référence au même objet de la vue parent utilise et accéder à la propriété que façon? Il semble que ViewModels traversant les propriétés de l'autre n'est pas très propre et les couple ensemble inutilement.
J'utilise déjà la messagerie pour notifier les sous-vues que l'utilisateur a sélectionné un nouvel élément dans la zone de liste déroulante et mise à jour en conséquence. Mais le type d'objet qui est sélectionné dans le ComboBox n'est pas vraiment directement lié à cette valeur de données que les sous-vues ont besoin.
En fait, un identifiant d'utilisateur authentifié n'est pas la seule valeur que je dois obtenir du ViewModel le plus haut; Il existe également une valeur de date de début et de fin dans les contrôles DatePicker qui doivent transmettre les sous-ViewModels pour filtrer certaines données. – mkmurray