2013-08-06 5 views
6

zu übergeben Könnte jemand so freundlich sein MVVM Light Messenger für mich zu erklären? Ich habe einen Post auf StackOverflow hier gelesen: MVVM pass values between view models versucht, dies zu bekommen. Die Dokumentation zu MVVM Light ist zu diesem Zeitpunkt noch nicht so großartig, daher bin ich mir völlig unsicher, wohin ich gehen soll.Verwenden Sie MVVM Light Messenger, um Werte zwischen View-Modell

Angenommen, ich habe zwei ViewModels und einen ViewModelLocator. Ich möchte in der Lage sein, Parameter zwischen allen drei ohne Problem zu übergeben. Wie würde ich das mit dem Boten tun? Ist es dazu fähig?

Edit: Hier ist meine neue Implementierung. Ab jetzt sieht es so aus, als ob MessengerInstance kein Token verlangt. Ich bin furchtbar verwirrt.

Im ersten Ansichtsmodell:

MessengerInstance.Send<XDocument>(SelectedDocument); 

Und in den zweiten:

MessengerInstance.Register<XDocument>(this, xdoc => CopySettings(xdoc)); 

kann völlig falsch sein. Habe keine Chance bekommen, es zu testen, aber Visual Studio wird weniger wütend auf mich, wenn ich es so mache. Auch die MessengerInstance registriert sich, bevor die Nachricht gesendet wird.

+0

„, aber Visual Studio bekommt weniger wütend wenn ich es so mache ". Ha. Das brachte mich zum Lachen. :) –

Antwort

12

Angenommen, ich habe zwei ViewModels und einen ViewModelLocator. Ich möchte in der Lage sein, Parameter zwischen allen drei ohne Problem zu übergeben. Wie würde ich das mit dem Boten tun? Ist es dazu fähig?

Genau dafür ist es ja.

eine Nachricht zu senden:

MessengerInstance.Send(payload, token); 

Um eine Nachricht zu erhalten:

MessengerInstance.Register<PayloadType>(
    this, token, payload => SomeAction(payload)); 

Es gibt viele Überlastungen, also ohne genau zu wissen, was Sie versuchen, über den Boten zu erreichen, ich gewonnen Ich werde nicht auf alle eingehen, aber das obige sollte den einfachen Fall abdecken, eine Nachricht mit einer Nutzlast senden und empfangen zu wollen.

Beachten Sie, dass "Token" wirklich alles sein kann, das die Nachricht identifiziert. Während ein String oft dafür verwendet wird, ziehe ich eine Enumeration zu verwenden, weil es ein wenig sicherer ist und ermöglicht Intellisense „finden Verwendungen“ usw.

Zum Beispiel:

public enum MessengerToken 
{ 
    BrushChanged, 
    WidthChanged, 
    HeightChanged 
} 

Dann wird Ihr Sende-/Empfangs wäre so etwas wie:

// sending view model 
MessengerInstance.Send(Brushes.Red, MessengerToken.BrushChanged); 

// receiving view model 

// put this line in the constructor 
MessengerInstance.Register<Brush>(this, token, brush => ChangeColor(brush)); 

public void ChangeColor(Brush brush) 
{ 
    Brush = brush; 
} 

[EDIT] URL zu devuxer Kommentar unten geändert: http://blog.galasoft.ch/posts/2009/09/mvvm-light-toolkit-messenger-v2/

+0

Das ist perfekt! Ich habe versucht, nach Dokumentation zu suchen, fand aber keine. Weißt du, welche Unterlagen ich vermisse? Ich habe fast keine für MVVM Light gesehen. – DanteTheEgregore

+0

Der Typ, der MVVM Light entwickelt hat, Laurent Bugnion, neigt dazu, seinen Blog für die Einführung neuer Funktionen oder Aktualisierungen von Funktionen zu verwenden. Hier ist ein spezieller Eintrag zum Messenger, den Sie vielleicht hilfreich finden: http://blog.galasoft.ch/lbugnion/archive/2009/09/27/mvvm-light-toolkit-messenger-v2-beta.aspx – devuxer

+0

Ich war für eine Operation und hatte keine Chance, dies bis heute zu implementieren. Ich sehe nicht, wo MessengerInstance ein Token aufruft. Ich füge meine Implementierung zum Hauptpost hinzu. Ich habe auch hier eine andere Frage gestellt: http://stackoverflow.com/questions/18241290/mvvm-light-messenger-not-functioning-as-expected/18241995?noredirect=1#18241995 – DanteTheEgregore