J'utilise MVVM Light et j'utilise des messages pour communiquer entre ViewModels et permettre à un ViewModel de savoir quand il peut exécuter quelque chose. Mon problème est que je m'inscris pour un message et ensuite il le reçoit plusieurs fois. donc, pour éviter que mon programme exécute quelque chose plus d'une fois, je dois créer des drapeaux booléens pour voir s'il a déjà été reçu. Une idée de pourquoi ça fait ça et comment je peux l'arrêter?MVVM Light Messenger s'exécutant plusieurs fois
Répondre
J'ai déjà vu ce problème. Cela avait à voir avec Messenger.Default.Register étant appelé plus d'une fois. La classe MVVMLight Messenger enregistrera le même nombre d'éléments 'x'. C'est pourquoi lorsque vous appelez le Send, vous l'obtenez plusieurs fois.
Quelqu'un sait comment empêcher MVVMLight de s'enregistrer plusieurs fois?
J'ai trouvé pour mon problème au moins parce que d'autres modèles de vue et des vues étaient en mémoire. J'ai toujours un problème où je dois envoyer un message de vm à une vue. Mon problème maintenant est que toutes les instances précédentes de cette vue sont toujours en mémoire afin que le message soit envoyé et reçu plusieurs fois – Jason
Assurez-vous de désenregistrer vos gestionnaires de messages dès que vous n'en avez plus besoin. Le Messenger conserve une référence aux méthodes enregistrées et cela les empêche d'être collectées. Par conséquent, pour ViewModels: assurez-vous que vous appelez Cleanup une fois que vous avez terminé (ou implémentez IDisposable et appelez Cleanup à partir de là). Pour les vues (contrôles, Windows ou similaires), appelez Messenger.Unregister dans un événement qui survient lors du démontage de la vue, par ex. l'événement Unloaded.
Ceci est un comportement connu du MVVM et a été discuté en plusieurs endroits.
... sauf que dans WPF, l'événement UserControl.Unloaded n'est pas garanti d'être déclenché, selon http://connect.microsoft.com/VisualStudio/feedback/details/575287/the-usercontrol-eloaded-event-is-not-raised-when-the-mainwindow-gets-closed - ce n'est donc pas si simple. –
Le point que je fais est que vous devez nettoyer derrière le Messenger, sinon, il continuera à traiter les messages, bien qu'il ne devrait plus le faire. L'événement Unloaded est un endroit, mais ce n'est peut-être pas le seul ou le meilleur. – AxelEckenberger
Très vieille question, mais je résolu le problème en faisant ceci:
static bool isRegistered = false;
puis, dans le constructeur:
if(!isRegistered)
{
Messenger.Default.Register<MyMessage>(this, OnMessageReceived);
isRegisterd = true;
}
Ceci est le correctif probable pour le problème et ne pas enregistrer le Messenger dans le constructeur. –
vraiment vieux mais je pensais que je répondrais juste au cas où quelqu'un en a besoin J'étais assez nouveau à Silverlight à l'époque et le problème a fini par être une fuite de mémoire que le viewModel, qui avait plusieurs instances, était encore en mémoire.
Comme d'autres contributeurs mentionnés, le même message est enregistré plusieurs fois. J'ai remarqué que ce comportement se produisait lors de la navigation vers View X puis de la navigation vers View Z où le message est enregistré dans le constructeur du Z ViewModel. Une solution consiste à définir la propriété NavigationCacheMode sur Obligatoire
<Page
........
........
NavigationCacheMode="Required">
- 1. MVVM Light toolkit + Messenger
- 2. MVVM Light Toolkit Messenger Messages chaînés
- 3. MVVM Light - using ViewModelLocator - propriétés atteintes plusieurs fois
- 4. MVVM Light Messenger - Comment testez-vous les messages ciblés?
- 5. Modification d'enregistrements avec MVVM/MVVM-Light
- 6. Problèmes de messagerie MVVM light toolkit
- 7. MVVM Light Messagerie Problème
- 8. MVVM Light Messaging
- 9. mvvm light - messagerie
- 10. MVVM Light Threading Exemple
- 11. Coulée dans MVVM Light CommandParameterValue
- 12. en utilisant MVVM light messenger avec Silverlight 4 Classe de dialogue ChildWindow
- 13. MVVM Light est trop rapide :)
- 14. MVVM Light et SL3 Commanding
- 15. MVVM Light avec ASP.Net MVC?
- 16. MVVM Light Toolkit contre Cinchv2?
- 17. Modèle MVVM-Light Locator et UserControl réutilisable
- 18. Comment utiliser MVVM Light Toolkit avec un projet existant non-MVVM Light Toolkit
- 19. Comment travailler avec ViewModelLocator dans Mvvm Light
- 20. Exemple de MVVM Light Toolkit avec RibbonControlsLibrary
- 21. événement SelectionChanged liaison dans Silverlight + MVVM-Light
- 22. MVVM Light Toolkit lance une exception System.IO.FileLoadException
- 23. compatibilité mvvm-light et silverlight 4
- 24. Comment utiliser mvvm-light pour déclencher gotfocus
- 25. mvvm light PassEventArgsToCommand casser l'application dans ListBoxDragDropTarget
- 26. mvvm-light v4 - bien quelqu'un doit demander :-)
- 27. mvvm-light Messager RaisePropertyChanged non diffusé
- 28. mvvm light MIX10 démo RelayCommand question
- 29. MVVM-Light: Charger UserControl dans la fenêtre
- 30. MVVM Light - Silverlight 4 Source Code
Où votre message est-il envoyé? Avez-vous traversé la source lumineuse MVVM pour savoir pourquoi le message est envoyé plusieurs fois? Il y a une certaine quantité de travail que vous pouvez faire, ou plus de détails que vous pouvez fournir, avant que votre question puisse être résolue. –