2012-06-28 34 views
5

MVVMとMicrosoft Prism librariesを使用してWPFプロジェクトを作成しています。だから、私はクラスMicrosoft.Practices.Prism.MefExtensions.Events.MefEventAggregatorを使用して、私はイベントをパブリッシュクラスを介して通信し、以下のような方法をサブスクライブする必要がある場合:公開するにはEventAggregatorとMicrosoft Prismライブラリを使用してサブスクライブされたメソッドからデータを返す方法

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

を購読するには:

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

私の質問は:イベントを公開した後、「購読済みのメソッド」からデータを返す方法はありますか?

答えて

12

私の知る限りでは、すべてのイベントの加入者は、(デフォルトでもある)ThreadOption.PublisherThreadオプションを使用している場合、イベントは同期的に実行され、加入者はEventArgsオブジェクトを変更することができますので、あなたが出版社に持っている可能性があり

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

加入者コードは次のようになります。

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

あなたはイベントが常に同期的に呼び出されるべきであることがわかっている場合は、あなたがあなた自身のベースCLASを作成することができます(CompositePresentationEvent<T>の代わりに)Subscribeメソッドをオーバーライドし、サブスクライバーがThreadOption.PublisherThreadオプションのみを使用できるようにします。それはこのようになります:

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

を、代わりにCompositePresentationEventからMyEventを導出するのは、イベントを同期的に呼び出されることを保証するであろうと、あなたが変更しEventArgsを取得すること、SynchronousEventからそれを引き出します。

+0

あなたの返事をありがとう、私はあなたのポイントを理解することができた、私はEventArgsを介してデータを返し、それは動作します。記録のために、メソッド 'SubscriptionToken'は' virtual'ではないので、私は 'SyncronousEvent'クラスを作成できませんでした。 Howerverあなたの質問は私に非常に有用だった。 – Dante

+0

@Dante 'SubscriptionToken'ではなく、' Subscribe'メソッド(これは仮想です)をオーバーライドしています。 –

+0

申し訳ありませんが、私の悪い、私は方法の 'バーチャルではない購読'について話していた、私はそれを今見ているとあなたの例をコンパイルしようとするとVS2010は、とにかく、あなたの解決策は、私が探していたものです。ありがとうございます。 – Dante

関連する問題