2013-08-06 12 views
6

Qualcuno potrebbe essere così gentile da spiegare MVVM Light Messenger per me? Stavo leggendo un post su StackOverflow qui: MVVM pass values between view models cercando di ottenere questo. La documentazione su MVVM Light non è eccezionale a questo punto, quindi sono completamente insicuro su dove andare.Usa Messenger di MVVM Light per passare i valori tra la vista Modello

Dire che ho due ViewModels e un ViewModelLocator. Voglio essere in grado di passare i parametri tra tutti e tre senza problemi. Come faccio a fare questo con il messenger? È capace di quello?

Modifica: ecco la mia nuova implementazione. A partire da ora, sembra che MessengerInstance non invochi un token. Sono terribilmente confuso.

Nel primo ViewModel:

MessengerInstance.Send<XDocument>(SelectedDocument); 

E nel secondo:

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

potrebbe essere completamente sbagliato. Non ho avuto la possibilità di testarlo, ma lo studio visivo diventa meno arrabbiato con me quando lo faccio in questo modo. Anche MessengerInstance si registra prima che il messaggio venga inviato.

+0

", ma visual Studio ottiene meno arrabbiato con me quando lo faccio in questo modo ". Ha. Questo mi ha fatto ridere. :) –

risposta

12

Dire che ho due ViewModels e un ViewModelLocator. Voglio essere in grado di passare i parametri tra tutti e tre senza problemi. Come faccio a fare questo con il messenger? È capace di quello?

Questo è esattamente ciò che è per, sì.

Per inviare un messaggio:

MessengerInstance.Send(payload, token); 

Per ricevere un messaggio:

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

Ci sono molti sovraccarichi, quindi senza sapere esattamente cosa si sta cercando di realizzare attraverso il messenger, ho vinto Entriamo in tutti, ma quanto sopra dovrebbe riguardare il semplice caso di voler inviare e ricevere un messaggio con un carico utile.

Si noti che "token" può essere davvero qualsiasi cosa che identifica il messaggio. Mentre una stringa viene spesso utilizzato per questo, io preferisco usare un enum perché è un po 'più sicuro e consente intellisense, "trovare usi", ecc

Ad esempio:

public enum MessengerToken 
{ 
    BrushChanged, 
    WidthChanged, 
    HeightChanged 
} 

Allora la vostra inviare/ricevere sarebbe qualcosa di simile:

// 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 al commento di devuxer seguito cambiato in: http://blog.galasoft.ch/posts/2009/09/mvvm-light-toolkit-messenger-v2/

+0

Questo è perfetto! Ho provato a cercare la documentazione su questo, ma non ne ho trovati. Conosci qualche documentazione che potrebbe mancare? Non ne ho visto quasi nessuno per MVVM Light. – DanteTheEgregore

+0

Il tizio che ha sviluppato MVVM Light, Laurent Bugnion, tende a usare il suo blog per introdurre nuove funzionalità o aggiornamenti alle funzionalità. Ecco una voce specifica sul messenger che potresti trovare utile: http://blog.galasoft.ch/lbugnion/archive/2009/09/27/mvvm-light-toolkit-messenger-v2-beta.aspx – devuxer

+0

Sono stato fuori per un intervento chirurgico e non ho avuto la possibilità di iniziare ad implementarlo fino ad oggi. Non vedo dove MessengerInstance richiede un token. Aggiungerò la mia implementazione al post principale. Ho anche postato un'altra domanda qui: http://stackoverflow.com/questions/18241290/mvvm-light-messenger-not-functioning-as-expected/18241995?noredirect=1#18241995 – DanteTheEgregore

Problemi correlati