2012-06-28 17 views
5

MVVM ve Microsoft Prism libraries kullanarak bir WPF projesi üzerinde çalışıyorum. Ben sınıfları aracılığıyla iletişim kurmak gerektiğinde Yani, aşağıdaki gibi yöntemler Dersim Microsoft.Practices.Prism.MefExtensions.Events.MefEventAggregator kullanmak ve etkinlikleri yayınlamak ve abone:EventAggregator ve Microsoft Prism kitaplıkları kullanılarak abone olunan bir yöntemden veri döndürme

yayınlamak için:

myEventAggregator.GetEvent<MyEvent>().Publish(myParams)

Abone için:

myEventAggregator.GetEvent<MyEvent>().Subscribe(MySubscribedMethod)

Ancak sorum şu: Bir etkinlik yayınladıktan sonra "Abone Olma yönteminden" bazı verileri döndürmenin bir yolu var mı?

cevap

12

olarak bildiğim kadarıyla tüm olay aboneleri (aynı zamanda varsayılan) ThreadOption.PublisherThread seçeneği kullanıyorsanız, olay eşzamanlı gerçekleştirilen ve aboneler EventArgs nesneyi değiştirebilir, böylece yayıncı içinde olabilir

myEventAggregator.GetEvent<MyEvent>().Publish(myParams) 
if (myParams.MyProperty) 
{ 
    // Do something 
} 

abone kodu şu şekilde görünecektir:

// Either of these is fine. 
myEventAggregator.GetEvent<MyEvent>().Subscribe(MySubscribedMethod) 
myEventAggregator.GetEvent<MyEvent>().Subscribe(MySubscribedMethod, ThreadOption.PublisherThread) 

private void MySubscribedMethod(MyEventArgs e) 
{ 
    // Modify event args 
    e.MyProperty = true; 
} 

olay her zaman eşzamanlı olarak adlandırılan gerektiğini biliyorsanız, kendi tabanı clas oluşturabilir Subscribe yöntemini geçersiz kılan ve yalnızca abonelerin ThreadOption.PublisherThread seçeneğini kullanmasına izin veren olaylar için (CompositePresentationEvent<T> yerine). Böyle bir şey olacaktır:

public class SynchronousEvent<TPayload> : CompositePresentationEvent<TPayload> 
{ 
    public override SubscriptionToken Subscribe(Action<TPayload> action, ThreadOption threadOption, bool keepSubscriberReferenceAlive, Predicate<TPayload> filter) 
    { 
     // Don't allow subscribers to use any option other than the PublisherThread option. 
     if (threadOption != ThreadOption.PublisherThread) 
     { 
      throw new InvalidOperationException(); 
     } 

     // Perform the subscription. 
     return base.Subscribe(action, threadOption, keepSubscriberReferenceAlive, filter); 
    } 
} 

sonra yerine CompositePresentationEvent den MyEvent türetmek yerine, olay eşzamanlı olarak adlandırılan olacağını size garanti edecek ve modifiye EventArgs alacak, SynchronousEvent onu türetmek.

+0

Cevabınız için teşekkür ederiz, noktanızı anlayabiliyorum, verileri EventArgs aracılığıyla döndürüyorum ve işe yarıyor. Sadece kayıt için, 'SubscriptionToken' sanal değil 'yönteminden bu yana SyncronousEvent sınıfı oluşturamadım. Howerver, sorunuz bana çok yardımcı oldu. – Dante

+0

@Dante AbonelikToken'i değil, 'Abone' yöntemini (sanal olan) geçersiz kılmıyorsunuz. –

+0

Üzgünüm, kötüyüm, sanal olmayan 'Abone 'yönteminden bahsediyordum, şu anda ona bakıyorum ve eğer örneklemini derlemeye çalışırsam VS2010 bana yöntemin sanal olmadığını söyler. Her neyse, aradığınız şey benim çözümüm, teşekkürler – Dante

İlgili konular