Le choix entre les propriétés de ViewModel liées ou la messagerie pour communiquer entre ViewModel et View en utilisant le Light Toolkit MVVM

StackOverflow https://stackoverflow.com/questions/4002667

  •  25-09-2019
  •  | 
  •  

Question

J'utilise boîte à outils MVVM Light (que j'aime). J'ai actuellement la messagerie en place pour une interaction provenant du ViewModel et destinés à la consommation par la vue. En général, ces types de messages indiquent la vue doit faire quelque chose comme se cacher, montrer un message de confirmation que les données ont été enregistrées, etc.

Cela fonctionne. Dans le constructeur pour la vue, je me inscrire au Messager:

Messenger.Default.Register<NotificationMessage<PaperNotification>>(this, n => HandlePaperNotification(n));

Quand j'utilise le Messenger pour communiquer des préoccupations transversales entre ViewModels (comme identité), je peux voir que lorsque le ViewModel est nettoyé dans le ViewModelLocator, la classe de base pour ViewModels (ViewModelBase) désinscrit des messages auxquels vous êtes abonné. Je n'ai rien à faire, comme MVVM gère la lumière boîte à outils pour moi. Cependant, quand je les utilise dans les vues, je les désenregistrer expressément à la clôture, comme suit:

Messenger.Default.Unregister(this);

Je suppose que je pourrais mettre en œuvre une classe de base pour les vues d'hériter de.

Cependant, il me semble que peut-être cela est une odeur de code à l'aide du Messenger dans la vue ... il fonctionne, mais il pourrait ne pas être la meilleure façon. Je me demande si je devrais plutôt créer une propriété sur le ViewModel et lier quelle partie des éléments de la vue de son. Dans l'exemple de cacher une forme, une propriété pourrait être un booléen appelé « Show ». Comme je pense, je peux voir que dans de nombreux cas, cela se traduira par avoir à écrire un ValueConverter. Une façon semble moins testable. L'autre façon semble exiger beaucoup plus de code et peut-être l'introduction d'un excès ValueConverters, qui pourrait devenir une odeur de code en eux-mêmes.

(après tout cela construire) ma question est la suivante:

Est-il préférable d'utiliser des messages dans la vue ou est-il préférable d'ajouter des propriétés (et potentiellement ValueConverters) pour permettre au ViewModel de le conduire de façon plus bindable?

Était-ce utile?

La solution

Dans MVVM. ViewModel comunicates avec Vue par DataBinding et commandes. Si vous avez besoin d'autres fonctionnalités, vous devez le mettre en œuvre en utilisant ce moyen. La messagerie est censé être seulement pour ViewModels. Les vues sont censés être « stupides » visualiseurs de vos données dans ViewModel.

Autres conseils

La logique de messagerie dans MVVM Light est là pour la communication entre ViewModels. Je ne l'ai jamais couru dans toute communication entre vue et ViewModel que je ne pouvais pas résoudre avec la liaison et / ou des commandes. Parfois, je dois valeur Converters et parfois je besoin d'un code dans le code-behind, mais je ne l'ai jamais dû faire ViewModel pousser directement les données à la vue.

Ceci est une discussion intéressante et je l'ai trouvé ce fil quand je me demandais modèle en vue de voir la communication. Fait intéressant, le créateur de MVVMLight semble trouver parfaitement acceptable d'envoyer des messages à partir d'un modèle en vue d'une voir . Un autre exemple de différentes opinions sur ce qui est une bonne conception MVVM.

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