Forum Xamarin.Forms
We are excited to announce that the Xamarin Forums are moving to the new Microsoft Q&A experience. Q&A is the home for technical questions and answers at across all products at Microsoft now including Xamarin!

We encourage you to head over to Microsoft Q&A for .NET for posting new questions and get involved today.

How to MessagingCenter.Subscribe to same message from multiple senders

cmeerencmeeren USMember ✭✭
edited September 2016 in Xamarin.Forms

I want to subscribe to a message that can be sent from multiple ViewModels. Is there a more elegant solution than subscribing individually for each ViewModel, like I do below?

MessagingCenter.Subscribe<Page1Model, bool>(this, "SomeMessage", MyMethod);
MessagingCenter.Subscribe<Page2Model, bool>(this, "SomeMessage", MyMethod);

Best Answer


  • cmeerencmeeren USMember ✭✭

    If I were to use Application, then I'm tying my view models to my view. Also, it becomes harder to test the VMs directly.

    Thanks for the tip on using domain-specific models, I'll keep that in mind.

  • Nicolas.BodinNicolas.Bodin USMember ✭✭

    The @RobertMcIntosh answer is really good but I want to share my solution :)

    Like the accepted answer I wrap the MessagingCenter inside my own class :

    void SubscribeToDoAction<T>() where T : class
        MessagingCenter.Subscribe<T>(this, "message", (sender) => 
            ( your action ... )

    The way to send the message is exactly the same as usual, it does not matter what class is sending (Sender1, Sender2, ...)

    MessagingCenter.Send(this, "message");

    And I subscribe to it like this :


  • _XANDER__XANDER_ Member ✭✭

    Without sending arguments:

    // Subscribe
    MessagingCenter.Subscribe<object>(this, "Arrived", (sender) =>
        // Do something whenever the "Arrived" message is sent from whatever type <object> is.
    // Send
    MessagingCenter.Send<object>(this, "Arrived");
    // Unsubscribe
    MessagingCenter.Unsubscribe<object>(this, "Arrived");

    With sending arguments:

    // Subscribe
    MessagingCenter.Subscribe<object, string>(this, "Arrived", (sender, arg) =>
        // Do something whenever the "Arrived" message is sent from whatever type <object> is.
        myEntry.Text = arg;
    // Send
    MessagingCenter.Send<object, string>(this, "Arrived", "New String");
    // Unsubscribe
    MessagingCenter.Unsubscribe<object, string>(this, "Arrived");
    // Source:

    The alternative way is to create a class that has nothing to do with either class that's sending or subscribing to the message. It could be as simple as a marker class or a class that has no properties or functions:

    // Subscribe
    MessagingCenter.Subscribe<LoginMessage>(this, "successful_login", (lm) => HandleLogin(lm));
    // Send
    MessagingCenter.Send<LoginMessage>(new LoginMessage, "successful_login");
    // Source:

    p.s. Cannot post links at the moment, that is why via comments.

  • JassimRahmaJassimRahma USMember ✭✭✭✭

    I am still not clear on this guys

    I want to Send:

    MessagingCenter.Send(this, "Country", country_code);


    MessagingCenter.Send(this, "Country", country_name);

    to the Signup page

    How can I do that please?

Sign In or Register to comment.