7
votes

Silverlight - Communiquez entre 2 modèles de vue dans MVVM à l'aide de commandes

Je travaille sur MVVM et j'utilise de commander à Silverlight (délégationEvent et ICommand)

Je veux quelque chose comme ça, (disons) J'ai 2 Usercontrols, parent et enfant.

Le parent héberge l'enfant, les deux possèdent de leurs propres images de vue.

sur le parent J'ai un bouton et il exécute une simple commande, sur Execute de cette commande, je souhaite mettre à jour le texte dans la zone de texte du contrôle des enfants. Nous devrions aussi être capables de changer quelque chose dans l'enfant qui peut se propager au parent.

est des événements la meilleure réponse à cela ou que je puisse avoir des commandes pour mettre à jour l'enfant / informer le parent d'une manière ou d'une autre.


0 commentaires

3 Réponses :


12
votes

Il y a plusieurs façons d'aller à ce sujet.

Premièrement, il est tout à fait approprié d'avoir des images de vue composées d'autres mots de vue, à condition que vous puissiez bien avec elles d'être couplé de cette façon. Lorsque vous faites cela, ils peuvent simplement se parler à l'aide d'appels de méthode réguliers.

Ensuite, vous pouvez découpler un peu et utiliser des événements. Aucun problème avec ça. Il y a toujours un observateur -> couplage observable, mais ils dépendent moins les uns des autres.

Ensuite, vous pouvez découpler complètement et utiliser quelque chose comme un épargggregator (Prism a un bon que vous pouvez utiliser). Tirez sur une publication un message. L'autre abonne. Ils ne se connaissent pas du tout.

J'ai aussi utilisé des commandes pour cela ... mais pour la vue de la vue pour voir la communicationModel, je trouve cela pour être un peu maladroit.


0 commentaires

4
votes

Cela ressemble à une situation idéale pour utiliser un épargggrengator comme celui du conseil composite de l'application / prisme.

Dans ce modèle, vous pouvez configurer un messageBUS à la racine de l'application (ou d'une autre zone commune).

// en app.xaml.cs

IEVENTAGRGRGATOR STATIQUE PUBLIQUE MessageBus = Nouveau éparggregator ();

puis configurez une bibliothèque de messages courants xxx

où SimpleObject est une classe ou une variable contenant toutes les infos nécessaires pour traiter cet événement. xxx

où la technique éthod est une méthode qui prend un simpleObject comme paramètre.

Ensuite, vous pouvez jaillir des messages de n'importe où et les traiter n'importe où - sur les images, les commandes, etc. Vous pouvez même passer des obstacles entre composants si vous chargez de manière dynamique des parties de l'application. . Fonctionne bien.


1 commentaires

Où je me suis fait foiré avec ce type de configuration d'événement est l'endroit où le contrôle imbriqué existe dans plus d'une vue. Comme il s'agit d'une commande imbriquée (vue et viewmodel), il est raisonnable de supposer qu'il est imbriqué, car il est destiné à être un morceau de fonctionnalité réutilisable. Si des événements simples sont utilisés, il ne semble pas y avoir de bon moyen de ne cibler que «mes illustrations de mes enfants» au lieu de celles qui sont sur d'autres points de vue. Si la vue imbriquée et la machine virtuelle finissent d'être imbriquée dans plusieurs vues, vous pouvez rencontrer dans la situation où cliquer sur un bouton dans 1 vue provoque plusieurs autres vues à la mise à jour incorrecte.



4
votes

Vous devriez probablement commencer par la mise en œuvre la plus évidente où ViewModel parent contient simplement une référence à une vieille vieilleModel, et Witness ViewModel détient une référence à une vue parentModel. Ensuite, lorsqu'une commande est exécutée sur la vue parentModel, il définit simplement une valeur sur une vue enfant dans laquelle la zone de texte est liée à.

Ajout d'une couche d'abstraction entre les parents et l'enfant (par exemple les événements) ajoute un niveau de complexité et, par conséquent, il devrait être justifié. Si la valeur que cette indirection fournit est supérieure au coût de la complexité accrue du code (par exemple, il est maintenant moins clair que se passe-t-il lorsque la commande sur un parent est exécutée, vous devrez résoudre un problème comment les enfants sont souscrits à l'événement des parents sans obtenir le Référence réelle à elle et vice-versa, l'ajout de dépendances supplémentaires entre les parents qu'un enfant nécessitera l'ajout d'événements supplémentaires, qui pollua la logique réelle avec toute la plomberie, etc.), alors certainement des événements (ou quelque chose comme Procentierserver ) pourrait être une prochaine étape logique.


1 commentaires

Je conviens qu'il est préférable de commencer simple, puis d'introduire la complexité car elle est nécessaire. Il est important de mémoriser cependant les différents modèles et techniques de sorte que si vous rencontrez une limitation avec votre implémentation simple, vous avez un plan d'action pour passer à un motif alternatif. J'ai tendance à commenter mon code en conséquence pour aider à la rendre évidente lorsque certaines décisions de conception ont été apportées et peuvent changer.