2012-06-28 30 views
5

Tôi đang làm việc trên dự án WPF, sử dụng MVVM và Microsoft Prism libraries. Vì vậy, khi tôi cần phải giao tiếp thông qua các lớp học tôi sử dụng lớp Microsoft.Practices.Prism.MefExtensions.Events.MefEventAggregator và tôi công bố các sự kiện và đăng ký phương pháp như sau:Cách trả dữ liệu từ phương thức đã đăng ký bằng cách sử dụng thư viện EventAggregator và Microsoft Prism

Để xuất bản:

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

Để Theo dõi:

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

Nhưng câu hỏi của tôi là: Có cách nào trả lại một số dữ liệu từ "Phương thức đã đăng ký" sau khi xuất bản sự kiện không ??

Trả lời

12

Theo như tôi biết, nếu tất cả các thuê bao sự kiện đang sử dụng ThreadOption.PublisherThread tùy chọn (mà cũng là mặc định), sự kiện này được thực hiện đồng bộ và các thuê bao có thể sửa đổi các đối tượng EventArgs, vì vậy bạn có thể có trong nhà xuất bản

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

mã thuê bao sẽ trông như thế này:

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

Nếu bạn biết rằng sự kiện này luôn luôn nên được gọi là đồng bộ, bạn có thể tạo Clas cơ sở của riêng bạn s cho các sự kiện (thay vì CompositePresentationEvent<T>) ghi đè phương thức Subscribe và chỉ cho phép người đăng ký sử dụng tùy chọn ThreadOption.PublisherThread. Nó sẽ giống như thế này:

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

sau đó thay vì bắt nguồn từ MyEventCompositePresentationEvent, bạn lấy được nó từ SynchronousEvent, mà sẽ đảm bảo với bạn rằng sự kiện này sẽ được gọi là đồng bộ và rằng bạn sẽ nhận được sửa đổi EventArgs.

+0

Cảm ơn bạn đã trả lời, tôi có thể hiểu được quan điểm của bạn, tôi trả lại dữ liệu thông qua EventArgs và nó hoạt động. Chỉ cho bản ghi, tôi không thể tạo lớp 'SyncronousEvent' vì phương thức' SubscriptionToken' không phải là 'virtual'. Howerver câu hỏi của bạn là rất hữu ích cho tôi. – Dante

+0

@ Dante Bạn không ghi đè 'SubscriptionToken', nhưng phương thức' Đăng ký' (là ảo). –

+0

Xin lỗi, xấu của tôi, tôi đã nói về phương pháp 'Đăng ký' mà không phải là ảo, tôi đang nhìn vào nó ngay bây giờ và nếu tôi cố gắng biên dịch ví dụ của bạn VS2010 nói với tôi rằng phương pháp không phải là' ảo'. Dù sao, giải pháp của bạn là những gì tôi đang tìm kiếm, cảm ơn bạn – Dante

Các vấn đề liên quan