Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use MVVM Light's Messenger to Pass Values Between View Model

Tags:

c#

wpf

mvvm-light

Could someone be so kind as to explain MVVM Light's Messenger for me? I was reading a post on StackOverflow here: MVVM pass values between view models trying to get this. The documentation on MVVM Light's not that great at this point so I'm completely unsure where to go.

Say I have two ViewModels and a ViewModelLocator. I want to be able to pass parameters between all three without issue. How would I go about doing this with the messenger? Is it capable of that?

Edit: Here's my new implementation. As of now, it looks as if MessengerInstance doesn't call for a token. I'm terribly confused.

In the first ViewModel:

MessengerInstance.Send<XDocument>(SelectedDocument);

And in the second:

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

Could be completely wrong. Haven't gotten a chance to test it, but visual studio gets less angry with me when I do it this way. Also the MessengerInstance does register before the Message is sent.

like image 784
DanteTheEgregore Avatar asked Aug 06 '13 18:08

DanteTheEgregore


People also ask

How do you communicate between two view models?

We will how we can communicate between 2 View Models using Messenger. Then, we will create 2 MVVM Controls by name ControlA, ControlB and try to call a method in which is there is one view model within another view model. Go to Nuget manager and install MVVM Light. Create a Folder structure like below.

What does MVVM Light do?

MVVM-light is a toolkit written in C# which helps to accelerate the creation and development of MVVM applications in WPF, Silverlight, Windows Store, Windows Phone and Xamarin.

What is MVVM Light toolkit?

MVVM stands for Model View ViewModel, MVVM light toolkit is architectural design that is based on MVVM design pattern. MVVM is in part about avoiding code-behind in the View class. It is very popular architectural design pattern for XAML based applications like WPF, Silverlight, Windows phone app etc.


1 Answers

Say I have two ViewModels and a ViewModelLocator. I want to be able to pass parameters between all three without issue. How would I go about doing this with the messenger? Is it capable of that?

That's exactly what it's for, yes.

To send a message:

MessengerInstance.Send(payload, token);

To receive a message:

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

There are many overloads, so without knowing exactly what you're trying to accomplish via the messenger, I won't go into all of them, but the above should cover the simple case of wanting to send and receive a message with a payload.

Note that "token" can be really anything that identifies the message. While a string is often used for this, I prefer to use an enum because it's a little safer and enables intellisense, "find usages", etc.

For example:

public enum MessengerToken
{
    BrushChanged,
    WidthChanged,
    HeightChanged
}

Then your send/receive would be something like:

// 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 to devuxer's comment below changed to: http://blog.galasoft.ch/posts/2009/09/mvvm-light-toolkit-messenger-v2/

like image 136
devuxer Avatar answered Oct 28 '22 16:10

devuxer