2008-11-17 19 views
9

W System.ComponentModel istnieje klasa o nazwie CancelEventArgs, która zawiera element Anuluj, który można ustawić w detektorach zdarzeń. Dokumentacja na MSDN wyjaśnia, jak używać tego do anulowania zdarzeń z odbiornika, ale w jaki sposób użyć go do realizacji własnych anulowanych zdarzeń? Czy istnieje sposób sprawdzenia elementu Anuluj po uruchomieniu każdego detektora, czy też muszę poczekać, aż po uruchomieniu zdarzenia wszystkie jego słuchacze?Jak zaimplementować zdarzenie do anulowania?

Odpowiedz

16

Aby sprawdzić każdego słuchacza z kolei trzeba ręcznie uzyskać koparki poprzez 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

Podczas tego kodu będzie działać, jest to, że w normalnej eksploatacji CancelEventHandler? Zwykle nie są one używane w wzorach BeforeX, AfterX, gdzie, jeśli coś w Zanim ustawi Canel, wtedy X nie stanie się tak, że AfterX nie zostanie wywołany. Dlaczego ważne jest, aby powstrzymać innych słuchaczy przed wydarzeniem Before? –

+0

Chciałbym również poznać odpowiedź na powyższy komentarz dotyczący tego, dlaczego ważne jest, aby powstrzymać innych słuchaczy przed wydarzeniem Before. – MPavlak

+3

Wyobraź sobie dwóch subskrybentów tego samego zdarzenia (w tym samym obiekcie). Jeden ustawia 'cancel = true', a drugi" cancel = false ". Jak myślisz, co by się stało? Odpowiedź pokazuje, jak uniknąć takiej sytuacji. Jeśli co najmniej jeden subskrybent anuluje wydarzenie, zostanie anulowany. Kropka. – Joel

Powiązane problemy