7 Stimmen

MVVM Light Messenger wird mehrfach ausgeführt

Ich verwende MVVM Light und verwende Nachrichten, um zwischen ViewModels zu kommunizieren, um ein ViewModel wissen zu lassen, wenn es ok ist, etwas auszuführen. Mein Problem ist, dass ich für eine Nachricht registrieren und dann empfängt es mehrere Male. so von meinem Programm etwas mehr als einmal ausführen zu halten, muss ich boolesche Flaggen erstellen, um zu sehen, wenn es bereits empfangen wurde. Haben Sie eine Idee, warum das so ist und wie ich es stoppen kann?

9voto

AxelEckenberger Punkte 16238

Stellen Sie sicher, dass Sie Ihre Message Handler abmelden, wenn Sie sie nicht mehr benötigen. Der Messenger behält einen Verweis auf die registrierten Methoden und verhindert so, dass sie in den Müll geworfen werden.

Daher gilt für ViewModels: Stellen Sie sicher, dass Sie Cleanup aufrufen, sobald Sie fertig sind (oder implementieren Sie IDisposable und rufen Sie Cleanup von dort aus auf).

Für Views (Controls, Windows, o.ä.) rufen Sie Messenger.Unregister in einem Ereignis auf, das beim Abriss der View auftritt, z.B. das Unloaded-Ereignis.

Dies ist ein bekanntes Verhalten der MVVM und wurde bereits an mehreren Stellen diskutiert.

7voto

jcgalveza Punkte 361

Eine sehr alte Frage, aber ich habe das Problem folgendermaßen gelöst:

static bool isRegistered = false;

und dann, im Konstruktor:

if( !isRegistered )
{
   Messenger.Default.Register<MyMessage>(this, OnMessageReceived);
   isRegisterd = true;
}

1voto

dnndeveloper Punkte 1576

Ich habe dieses Problem schon einmal gesehen. Es hatte damit zu tun, dass Messenger.Default.Register mehr als einmal aufgerufen wurde. Die MVVMLight Messenger-Klasse registriert das gleiche Element x-mal. Das ist der Grund, warum Sie beim Aufrufen von "Send" die Nachricht viele Male erhalten.

Weiß jemand, wie man verhindern kann, dass sich MVVMLight mehrfach registriert?

1voto

Jason Punkte 1230

Wirklich alt, aber ich dachte, ich würde antworten, nur für den Fall, dass jemand es braucht. Ich war ziemlich neu in Silverlight zu der Zeit und das Problem endete ein Speicherleck als das viewModel, die mehrere Instanzen hatte, war noch im Speicher.

0voto

usefulBee Punkte 8632

Wie bereits von anderen Teilnehmern erwähnt, wird dieselbe Meldung mehrfach registriert. Ich habe festgestellt, dass dieses Verhalten auftritt, wenn ich zur Ansicht X und dann zurück zur Ansicht Z navigiere, wo die Nachricht im Konstruktor des Z-ViewModels registriert wird. Eine Lösung besteht darin, die NavigationCacheMode Eigenschaft zu Erforderlich

<Page
  ........
  ........
  NavigationCacheMode="Required">

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X