2012-06-28 9 views
5

Estoy trabajando en un proyecto WPF, usando MVVM y Microsoft Prism libraries. Así, cuando tenga que comunicar a través de clases utilizo la clase Microsoft.Practices.Prism.MefExtensions.Events.MefEventAggregator y publico eventos y suscribirse métodos de la siguiente manera:Cómo devolver datos de un método suscrito utilizando las bibliotecas EventAggregator y Microsoft Prism

de publicación:

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

para suscribirse:

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

Pero mi pregunta es: ¿Hay alguna manera de devolver algunos datos del "Método suscrito" después de publicar un evento?

Respuesta

12

Por lo que yo sé, si todos los suscriptores de eventos están utilizando la opción ThreadOption.PublisherThread (que es la opción por defecto), el evento se lleva a cabo de forma sincronizada y los abonados pueden modificar el objeto EventArgs, por lo que podría tener en el editor

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

el código de abonado se vería así:

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

Si sabe que el evento siempre se debe llamar de forma sincrónica, puede crear sus propias bases clas s para eventos (en lugar de CompositePresentationEvent<T>) que anula el método Subscribe, y solo permite a los suscriptores usar la opción ThreadOption.PublisherThread. Se vería algo como esto:

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

entonces en vez de derivar MyEvent de CompositePresentationEvent, que derivarla de SynchronousEvent, lo que le garantiza que el evento se llamará de forma sincrónica y que obtendrá la EventArgs modificado.

+0

Gracias por su respuesta, pude entender su punto, devuelvo los datos a través de EventArgs y funciona. Solo para el registro, no pude crear la clase 'SyncronousEvent' ya que el método' SubscriptionToken' no es 'virtual'. Howerver tu pregunta fue muy útil para mí. – Dante

+0

@Dante No está anulando 'SubscriptionToken', sino el método' Subscribe' (que es virtual). –

+0

Lo siento, mi mal, estaba hablando del método 'Suscribir' que no es virtual, lo estoy buscando ahora mismo y si trato de compilar su ejemplo VS2010 me dice que el método no es' virtual'. De todos modos, tu solución es lo que estaba buscando, gracias – Dante

Cuestiones relacionadas