wpf - silverlight-communique entre 2 modèles de vue dans MVVM à l'aide de commandes




silverlight-3.0 (2)

Je travaille sur MVVM et utilise la commande dans silverlight (DelegateEvent et ICommand)

Je veux quelque chose comme ça, (disons) j'ai 2 contrôles, parents et enfants.

Parent héberge l'enfant, les deux ont leur propre viewmodels.

Sur le parent j'ai un bouton et il exécute une commande simple, à l'exécution de cette commande je veux mettre à jour le texte dans la zone de texte du contrôle de l'enfant. nous devrions également être en mesure de changer quelque chose chez l'enfant qui peut se propager au parent.

Les événements sont la meilleure réponse pour cela ou je peux avoir des commandes pour mettre à jour l'enfant / notifier le parent d'une manière ou d'une autre.


Cela semble être une situation idéale pour l'utilisation d'un EventAggregator comme celui du Guidage d'application composite / Prisme.

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

// dans App.xaml.cs

public static IEventAggregator MessageBus = nouveau EventAggregator ();

Ensuite, configurez une bibliothèque de messages commune

// in Messages.cs

    public class SimpleCommand: CompositePresentationEvent<SimpleObject> { }

Où SimpleObject est une classe ou une variable qui contient toutes les informations nécessaires pour traiter cet événement.

// in control with button

    App.MessageBus.GetEvent<Messages.SimpleCommand>().Publish(SimpleObject);

// anywhere in your app that you "care" about this 

    App.MessageBus.GetEvent<Messages.SimpleCommand>().Subscribe(ProcessingMethod);

Où ProcessingMethod est une méthode qui prend un SimpleObject en tant que paramètre.

Ensuite, vous pouvez diffuser des messages de n'importe où et les traiter n'importe où - à travers les viewmodels, les contrôles, etc. Vous pouvez même passer MessageBuses entre les composants si vous chargez dynamiquement des parties de l'application. Fonctionne bien.


Il y a plusieurs façons de s'y prendre.

Tout d'abord, il est tout à fait approprié d'avoir ViewModels qui est composé d'autres ViewModels, tant que vous êtes OK avec eux étant couplés de cette façon. Lorsque vous faites cela, ils peuvent simplement se parler en utilisant des appels de méthode réguliers.

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

Ensuite, vous pouvez complètement découpler et utiliser quelque chose comme un EventAggregator (Prism en a un bon que vous pouvez utiliser). Photographier un Publier un message. L'autre s'abonne. Ils ne se connaissent pas du tout.

J'ai aussi utilisé des commandes pour cela ... mais pour ViewModel à ViewModel communication, je trouve cela un peu bizarre.







mvvm