2010-09-13 6 views
3

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

+0

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. –

Répondre

1

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?

+0

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

8

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.

+1

... 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. –

+0

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

5

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; 
} 
+0

Ceci est le correctif probable pour le problème et ne pas enregistrer le Messenger dans le constructeur. –

1

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.

0

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"> 
Questions connexes