wtorek, 29 stycznia 2013

[WPF] Caliburn.Micro: EventAggregator

Do komunikacji pomiędzy ViewModelami, Caliburn Micro wykorzystuje EventAggregatora. Tworzenie pojedynczej instancji ma miejsce w klasie AppBootstrapper (dodawanej do naszego projektu podczas instalacji Caliburna w projekcie), a konkretnie w funkcji Configure.

protected override void Configure() {
    var catalog = new AggregateCatalog(
        AssemblySource.Instance.Select(x => new AssemblyCatalog(x)).OfType<ComposablePartCatalog>()
        );

    container = new CompositionContainer(catalog);

    var batch = new CompositionBatch();

    batch.AddExportedValue<IWindowManager>(new WindowManager());
    batch.AddExportedValue<IEventAggregator>(new EventAggregator());
    batch.AddExportedValue(container);
    batch.AddExportedValue(catalog);

    container.Compose(batch);
}

W ViewModelach EventAggregator dostępny jest dzięki kontenerowi IoC. Dobrą praktyką jest, aby wiadomości nadawane przez EventAggregatora były osobnych, dedykowanych w tym celu typów. Aby nadać taką wiadomość wystarczy w danym ViewModelu:

var person = ea.AddedItems[0] as Person;
var msg = new NewPersonMessage() {Entity = person};
var evag = IoC.Get<IEventAggregator>();
evag.Publish(msg);

Po stronie subskrybenta należy implementować interfejs IHandle<T> z konkretnym typem wiadomości obsługiwanym w funkcji Handle(T).

public class PersonDetailsViewModel : Screen, IHandle<NewPersonMessage>
{
    public PersonDetailsViewModel()
    {
        var ea = IoC.Get<IEventAggregator>();
        ea.Subscribe(this);
    }

    public void Handle(NewPersonMessage message)
    {
        Entity = message.Entity;
    }
}

Brak komentarzy:

Prześlij komentarz