2008-11-17 16 views
9

En System.ComponentModel, hay una clase llamada CancelEventArgs que contiene un miembro de cancelación que se puede establecer en los detectores de eventos. La documentación en MSDN explica cómo usar eso para cancelar eventos desde un oyente, pero ¿cómo lo uso para implementar mis propios eventos cancelables? ¿Hay alguna manera de verificar el miembro Cancelar después de que cada oyente dispara, o tengo que esperar hasta que el evento haya despedido a todos sus oyentes?¿Cómo implemento un evento cancelable?

Respuesta

16

Para comprobar cada oyente a su vez, es necesario obtener manualmente los controladores a través de GetInvocationList:

class Foo 
{ 
    public event CancelEventHandler Bar; 

    protected void OnBar() 
    { 
     bool cancel = false; 
     CancelEventHandler handler = Bar; 
     if (handler != null) 
     { 
      CancelEventArgs args = new CancelEventArgs(cancel); 
      foreach (CancelEventHandler tmp in handler.GetInvocationList()) 
      { 
       tmp(this, args); 
       if (args.Cancel) 
       { 
        cancel = true; 
        break; 
       } 
      } 
     } 
     if(!cancel) { /* ... */ } 
    } 
} 
+5

Mientras que el código va a funcionar, es que el funcionamiento normal de un CancelEventHandler? ¿No se usan generalmente en un patrón BeforeX, AfterX, donde si algo en Before establece Canel, entonces X no ocurre, por lo que AfterX no se llama. ¿Por qué es importante evitar que otros oyentes reciban el evento Before? –

+0

También me gustaría saber la respuesta al comentario anterior sobre por qué es importante evitar que otros oyentes reciban el evento Before. – MPavlak

+3

Imagine dos suscriptores para el mismo evento (en el mismo objeto). Uno establece 'cancel = true' y el segundo" cancel = false ". ¿Qué crees que pasaría? La respuesta muestra cómo evitar tal situación. Si al menos un suscriptor cancela el evento, entonces se cancela. Período. – Joel

Cuestiones relacionadas