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