2012-06-28 9 views
5

Sto lavorando a un progetto WPF, utilizzando MVVM e Microsoft Prism libraries. Così, quando ho bisogno di comunicare attraverso le classi io uso la classe Microsoft.Practices.Prism.MefExtensions.Events.MefEventAggregator e pubblicare eventi e sottoscrivo metodi come di seguito:Come restituire i dati da un metodo sottoscritto utilizzando le librerie EventAggregator e Microsoft Prism

Per pubblicare:

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

Per iscriversi:

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

Ma la mia domanda è: C'è un modo per restituire alcuni dati dal "Metodo sottoscritto" dopo aver pubblicato un evento ??

risposta

12

Per quanto ne so, se tutti i sottoscrittori di eventi stanno utilizzando l'opzione ThreadOption.PublisherThread (che è anche l'impostazione predefinita), l'evento viene eseguita in modo sincrono e gli abbonati possono modificare l'oggetto EventArgs, così si potrebbe avere in casa editrice

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

il codice abbonato sarebbe simile a questa:

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

Se si sa che l'evento dovrebbe sempre essere chiamato in modo sincrono, è possibile creare il proprio clas di base s per eventi (invece di CompositePresentationEvent<T>) che sovrascrive il metodo Subscribe e consente solo agli abbonati di utilizzare l'opzione ThreadOption.PublisherThread. Sarebbe simile a questa:

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

allora invece di derivare da MyEventCompositePresentationEvent, si deriva da SynchronousEvent, che garantirà che l'evento si chiamerà in modo sincrono e che si otterrà la modifica EventArgs.

+0

Grazie per la risposta, ho capito il tuo punto, restituisco i dati tramite EventArgs e funziona. Per la cronaca, non ero in grado di creare la classe 'SyncronousEvent' poiché il metodo' SubscriptionToken' non è 'virtual'. Qualunque sia stata la tua domanda mi è stata di grande aiuto. – Dante

+0

@Dante Non si esegue l'override di 'SubscriptionToken', ma il metodo' Subscribe' (che è virtuale). –

+0

Scusa, peccato, stavo parlando del metodo "Subscribe" che non è virtuale, lo sto guardando proprio ora e se provo a compilare il tuo esempio VS2010 mi dice che il metodo non è 'virtual'. Ad ogni modo, la tua soluzione è quella che stavo cercando, grazie – Dante