Попытка понять Caliburn Micro EventAggregator

Я понял, как работает EventAggregator в Caliburn Micro, но я не понимаю этого:

Возьмем это в качестве примера:

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")
}

Итак, как я могу выбрать, какой дескриптор модели представления использовать при публикации событий?


person ANAKIN197    schedule 08.08.2017    source источник
comment
Вы можете создать типы сообщений, специфичные для модели представления, и заставить заинтересованные стороны прослушивать/обрабатывать эти типы сообщений.   -  person Nkosi    schedule 09.08.2017


Ответы (2)


Итак, как я могу выбрать, какой дескриптор модели представления использовать при публикации событий?

Несколько моделей представления могут подписаться на одно и то же сообщение. Вот как работает агрегация событий. Издатель публикует одно сообщение, не зная количества получателей.

Если вы хотите, чтобы конкретная модель представления могла подписаться на событие, она должна реализовать интерфейс IHandle<T> и вызвать метод Subscribe в агрегаторе событий:

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);
    }
}

Все модели представлений, которые сделают это, получат сообщение.

person mm8    schedule 09.08.2017

Мне удалось отправить сообщения на определенные модели просмотра через класс сообщений:

public class Message<TTarget, TValue>
{
    public TValue Value { get; set; }

    public Message(TValue value)
    {
        Value = value;
    }
}

Затем добавьте в класс

IHandle<Message<ViewModel, string>>

Использование:

_eventAggregator.PublishOnUIThread(new Message<ViewModel, string>("Hello from ViewModel"));
person Duch003    schedule 24.04.2020