MAUI-CommunityToolkit-4 :👈 👉:MAUI-CommunityToolkit-6

πŸ“… Hour 5 – Messenger (Decoupled Communication Between ViewModels)

πŸ“… Hour 5 – Messenger (Decoupled Communication Between ViewModels)

πŸ“‘ 1. What is Messenger?

Messenger is a communication system that allows ViewModels (or any classes) to send and receive messages without knowing each other. This helps keep the app loosely coupled.

Why Messenger?

  • πŸ”Œ No direct references between ViewModels
  • πŸ“© Send info from anywhere to anywhere
  • 🧹 Avoids memory leaks (WeakReference used)
  • πŸ— Useful for global events (login, refresh, theme change)

πŸ”— 2. WeakReferenceMessenger (Recommended)

The MVVM Toolkit uses WeakReferenceMessenger to ensure messages do not keep objects alive unnecessarily.

Key features:

  • πŸ“¬ Register receivers
  • πŸ“€ Send messages
  • 🧹 Automatic cleanup

πŸ“¨ 3. Sending a Message

Message class example:

public class RefreshMessage : ValueChangedMessage<bool>
{
    public RefreshMessage(bool value) : base(value) { }
}

Send it like this:

WeakReferenceMessenger.Default.Send(new RefreshMessage(true));

πŸ“¬ 4. Receiving Messages

Register in the ViewModel constructor:

public MyViewModel()
{
    WeakReferenceMessenger.Default.Register<RefreshMessage>(this, (r, m) =>
    {
        IsRefreshing = m.Value;
    });
}

βœ” ViewModel now listens for RefreshMessage


🧾 5. Simple Message (Without Value)

Create the message:

public class LogoutMessage { }

Send:

WeakReferenceMessenger.Default.Send(new LogoutMessage());

Receive:

WeakReferenceMessenger.Default.Register<LogoutMessage>(this, (r, m) =>
{
    LoggedIn = false;
});

πŸ“Œ 6. Broadcasting Data to Multiple ViewModels

Messenger supports broadcasting to multiple recipients at once.

Example:

WeakReferenceMessenger.Default.Send(new UserUpdatedMessage(user));

βœ” All ViewModels listening will receive the update.


🧠 7. Unregistering from Messenger

Best practice:

  • ➑️ Unregister when ViewModel is closed/destroyed
  • 🧼 Prevents memory leaks

Call:

WeakReferenceMessenger.Default.UnregisterAll(this);

πŸ“¨ 8. Using Strongly Typed Messages (ValueChangedMessage)

Example:

public class CountChangedMessage : ValueChangedMessage<int>
{
    public CountChangedMessage(int value) : base(value) { }
}

Send:

WeakReferenceMessenger.Default.Send(new CountChangedMessage(5));

Receive:

WeakReferenceMessenger.Default.Register<CountChangedMessage>(this, (r, m) =>
{
    Count = m.Value;
});

πŸ— 9. Messenger with ObservableRecipient (Optional)

ObservableRecipient integrates Messenger automatically.

public partial class ChatViewModel : ObservableRecipient
{
    public ChatViewModel()
    {
        IsActive = true; // automatically registers messenger
    }

    protected override void OnActivated()
    {
        Messenger.Register<ChatViewModel, NewMessage>(this, (r, m) =>
        {
            Messages.Add(m.Value);
        });
    }
}

βœ” This handles registration automatically when active.


πŸ› οΈ 10. Hour 5 Hands-On Tasks

  • πŸ“¨ Create a simple message class
  • πŸ“€ Send message from HomeViewModel
  • πŸ“¬ Receive it in DetailViewModel
  • πŸ“Š Update UI based on message value
  • 🧹 Add UnregisterAll() in ViewModel cleanup
  • πŸ“‘ Broadcast message to multiple listeners

πŸ“š 11. Hour 5 Practice ViewModel Example

public partial class HomeViewModel : ObservableObject
{
    [ICommand]
    private void NotifyRefresh()
    {
        WeakReferenceMessenger.Default.Send(new RefreshMessage(true));
    }
}

public partial class DetailViewModel : ObservableObject
{
    [ObservableProperty]
    private bool isRefreshing;

    public DetailViewModel()
    {
        WeakReferenceMessenger.Default.Register<RefreshMessage>(this, (r, m) =>
        {
            IsRefreshing = m.Value;
        });
    }
}

βœ” Pressing a button in HomeViewModel updates DetailViewModel instantly.


🏁 Hour 5 Goals Completed

  • πŸ“‘ Understand Messenger messaging concepts
  • πŸ“¨ Send and receive messages
  • πŸ”„ Use strongly typed ValueChangedMessage
  • 🧩 Communicate between ViewModels without coupling
  • 🧹 Unregister properly

πŸ“ Hour 5 – Messenger Quiz (CommunityToolkit.Mvvm)

πŸ“˜ Section A – Multiple Choice Questions

  1. What is the purpose of Messenger in MVVM Toolkit?
    a) To store application settings
    b) To handle UI animations
    c) To send messages between ViewModels without tight coupling
    d) To manage window lifecycles
  2. Which Messenger class is recommended for most apps?
    a) StrongMessenger
    b) GlobalMessenger
    c) WeakReferenceMessenger
    d) ViewMessenger
  3. Which message type is used to send a strongly-typed value?
    a) DataMessage
    b) SimpleMessage
    c) ValueChangedMessage<T>
    d) ValueMessage
  4. What must ViewModels do to receive messages?
    a) Call Listen()
    b) Register with the Messenger
    c) Add a MessageHandler attribute
    d) Implement IMessageReceiver
  5. What happens if you forget to unregister from Messenger?
    a) Nothing
    b) Potential memory leaks
    c) UI freezes
    d) Messages stop working completely

🧠 Section B – True or False

  1. True / False: Messenger allows ViewModels to communicate without referencing each other.
  2. True / False: WeakReferenceMessenger keeps strong references to receivers.
  3. True / False: Messenger can broadcast a single message to multiple ViewModels.
  4. True / False: ValueChangedMessage<T> carries a typed value.
  5. True / False: UnregisterAll() removes all message handlers for the target object.

✍️ Section C – Short Answer Questions

  1. Define what β€œdecoupled communication” means in MVVM Messenger.
  2. Why is WeakReferenceMessenger preferred over a normal Messenger?
  3. Write a simple message class for sending a string value.
  4. Explain how a ViewModel registers to receive a message.
  5. When should UnregisterAll() be used?

πŸ’» Section D – Code Interpretation

Given:

public class CountMessage : ValueChangedMessage<int>
{
    public CountMessage(int value) : base(value) { }
}

WeakReferenceMessenger.Default.Send(new CountMessage(4));
  1. What type of value is being sent?
  2. How does a ViewModel receive this message?
  3. What property of the message contains the value?
  4. Is this message strongly typed?

πŸ“‘ Section E – Messenger Logic

Given:

public class LogoutMessage { }
WeakReferenceMessenger.Default.Send(new LogoutMessage());
  1. Will the message carry any data?
  2. What happens if two ViewModels register for LogoutMessage?
  3. Write the line a ViewModel uses to unregister from all messages.

πŸ“˜ Hour 5 – Messenger Quiz Answer Key

βœ… Section A – Multiple Choice Answers

  1. c) To send messages between ViewModels without tight coupling
  2. c) WeakReferenceMessenger
  3. c) ValueChangedMessage<T>
  4. b) Register with the Messenger
  5. b) Potential memory leaks

🧠 Section B – True or False Answers

  1. True β€” Messenger enables ViewModels to communicate without referencing each other.
  2. False β€” WeakReferenceMessenger uses *weak* references, not strong ones.
  3. True β€” Many ViewModels can receive the same message.
  4. True β€” ValueChangedMessage<T> carries a strongly typed value.
  5. True β€” UnregisterAll() removes all message handlers for the object.

✍️ Section C – Short Answer Solutions

  1. Decoupled communication means ViewModels communicate without knowing each other’s type or instance.
  2. WeakReferenceMessenger avoids memory leaks by holding receivers with weak references.
  3. Simple message class:
    public class TextMessage : ValueChangedMessage<string>
    {
        public TextMessage(string value) : base(value) { }
    }
    
  4. A ViewModel receives a message by registering:
    WeakReferenceMessenger.Default.Register<TextMessage>(this, (r, m) =>
    {
        // handle message
    });
    
  5. Use UnregisterAll() when a ViewModel is closed or disposed to prevent leaks.

πŸ’» Section D – Code Interpretation Answers

  1. An integer value (4) is being sent.
  2. A ViewModel registers like:
    WeakReferenceMessenger.Default.Register<CountMessage>(this, (r, m) =>
    {
        // receive m.Value
    });
    
  3. m.Value stores the message value.
  4. Yes, CountMessage is strongly typed (int).

πŸ“‘ Section E – Messenger Logic Answers

  1. No, LogoutMessage carries no data.
  2. Both ViewModels will receive the message if they registered for it.
  3. Unregister from all messages using:
    WeakReferenceMessenger.Default.UnregisterAll(this);
    

πŸŽ‰ Hour 5 Answer Key Complete

Back to Index
MAUI-CommunityToolkit-4 :👈 👉:MAUI-CommunityToolkit-6
*