Search code examples
c#wpfmvvmcaliburn.microeventaggregator

Trying to understand Caliburn Micro EventAggregator


I understood how does EventAggregator work in Caliburn Micro but i don't understand this:

Let's take this as an example:

ViewModel A

private IEventAggregator _eventAggregator;
public ViewModelA(IEventAggregator eventAggregator)
{
   _eventAggregator = eventAggregator
   _eventAggregator.PublishOnUIThread("Hello");
}

ViewModel B

private IEventAggregator _eventAggregator;
public ViewModelA(IEventAggregator eventAggregator)
{
   _eventAggregator = eventAggregator
   _eventAggregator.Subscribe(this)
}
public void Handle(string message)
{ 
   MessageBox.Show(message + " From ViewModel B")
}

ViewModel C

private IEventAggregator _eventAggregator;
public ViewModelA(IEventAggregator eventAggregator)
{
   _eventAggregator = eventAggregator
   _eventAggregator.Subscribe(this)
}
public void Handle(string message)
{ 
   MessageBox.Show(message + " From ViewModel C")
}

So how can i select which viewmodel handle to use when i publish events?


Solution

  • So how can i select which viewmodel handle to use when i publish events?

    Several view models may subscribe to the same message. This is how event aggregation works. The publisher publishes a single message without any knowledge of the number of receivers.

    If you want a particular view model to be able to subscribe to an event, it should implement the IHandle<T> intertface and call the Subscribe method on the event aggregator:

    public class ViewModelA : IHandle<string>
    {
        private readonly IEventAggregator _eventAggregator;
    
        public ViewModelA(IEventAggregator eventAggregator)
        {
            _eventAggregator = eventAggregator;
            _eventAggregator.Subscribe(this);
        }
    
        public void Handle(string message)
        {
            MessageBox.Show(message);
        }
    }
    

    All view models that does this will receive the message.