2012-06-28 11 views
5

का उपयोग करके सब्स्क्राइब किए गए विधि से डेटा कैसे वापस करें I एमवीवीएम और Microsoft Prism libraries का उपयोग करके, एक WPF प्रोजेक्ट पर काम कर रहा हूं। तो, जब मैं कक्षाओं के माध्यम से संवाद करने के लिए की जरूरत है मैं नीचे के रूप में वर्ग Microsoft.Practices.Prism.MefExtensions.Events.MefEventAggregator का उपयोग करें और मैं घटनाओं प्रकाशित करने और सदस्यता लेने के तरीके:इवेंटएग्रेगेटर और माइक्रोसॉफ्ट प्रिज्म लाइब्रेरी

प्रकाशित करने के लिए:

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 विकल्प का उपयोग करने की अनुमति देता है। यह कुछ इस तरह दिखेगा: बजाय CompositePresentationEvent से MyEvent पाने की तो

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

, आप SynchronousEvent से निकाले जाते हैं, जो आप की गारंटी देगा कि घटना तुल्यकालिक बुलाया जाएगा और आप संशोधित EventArgs मिल जाएगा कि।

+0

आपके उत्तर के लिए धन्यवाद, मैं आपकी बात समझ सकता हूं, मैं EventArgs के माध्यम से डेटा वापस करता हूं और यह काम करता है। सिर्फ रिकॉर्ड के लिए, मैं 'सिंक्रोनसइवेंट' वर्ग बनाने में सक्षम नहीं था क्योंकि विधि 'सदस्यता टोकन' वर्चुअल' नहीं है। आपका प्रश्न मेरे लिए बहुत उपयोगी था। – Dante

+0

@Dante आप 'सदस्यता टोकन' को ओवरराइड नहीं कर रहे हैं, लेकिन 'सदस्यता लें' विधि (जो आभासी है)। –

+0

क्षमा करें, मेरा बुरा, मैं 'सदस्यता' विधि के बारे में बात कर रहा था जो वर्चुअल नहीं है, मैं अभी इसे देख रहा हूं और यदि मैं आपके उदाहरण को संकलित करने का प्रयास करता हूं तो VS2010 मुझे बताता है कि विधि 'आभासी' नहीं है। वैसे भी, आपका समाधान वह है जो मैं ढूंढ रहा था, धन्यवाद – Dante

संबंधित मुद्दे