2013-02-20 11 views
21

Mam kontrolę użytkownika, która wywołuje zdarzenie po komunikowaniu się z usługą sieci Web. Rodzic obsługuje to zdarzenie po podniesieniu. Co byłoby dobrym podejściem byłoby przekazanie obiektu zwróconego z usługi sieci web rodzicowi jako zdarzenie?Jak przekazywać obiekty w EventArgs

Jeśli jest to właściwy sposób, nie mogę znaleźć instrukcji, jak to zrobić.

UserControl

public event EventHandler LoginCompleted; 

potem po Object Zwraca biz:

if (this.LoginCompleted != null) 
     { 
      this.LoginCompleted(this, new EventArgs() //this is where I would attach/pass my biz object no?); 
     } 

dominującej

ctrl_Login.LoginCompleted += ctrl_Login_LoginCompleted; 
....snip.... 
void ctrl_Login_LoginCompleted(object sender, EventArgs e) 
    { 
     //get my object returned by login 
    } 

Moje pytanie brzmi, jaka byłaby "zatwierdzona" metoda uzyskiwania obiektu użytkownika z powrotem do rodzica? Utwórz klasę właściwości, do której wszystko może uzyskać dostęp i umieścić ją?

Odpowiedz

35

Trzeba by zadeklarować swoją imprezę za pomocą EventHandler<T> gdzie T to klasa, która wywodzi się z EventArgs:

public event EventHandler<LoginCompletedEventArgs> LoginCompleted; 

LoginCompletedEventArgs mógłby wyglądać następująco:

public class LoginCompletedEventArgs : EventArgs 
{ 
    private readonly YourBusinessObject _businessObject; 

    public LoginCompletedEventArgs(YourBusinessObject businessObject) 
    { 
     _businessObject = businessObject; 
    } 

    public YourBusinessObject BusinessObject 
    { 
     get { return _businessObject; } 
    } 
} 

Wykorzystanie byłoby tak:

private void RaiseLoginCompleted(YourBusinessObject businessObject) 
{ 
    var handler = LoginCompleted; 
    if(handler == null) 
     return; 

    handler(this, new LoginCompletedEventArgs(businessObject)); 
} 

Proszę zauważyć, w jaki sposób zaimplementowałem RaiseLoginCompleted. Jest to wątkowa wersja podnoszenia zdarzenia. Eliminuję możliwe NullReferenceException, które mogą wystąpić w scenariuszu warunków wyścigu, w którym jeden wątek chce podnieść zdarzenie, a inny wątek anuluje subskrypcję ostatniego programu obsługi po sprawdzeniu if, ale przed faktycznym wywołaniem programu obsługi.

+0

To jest bilet !! Pozwól mi zaimplementować i od razu wrócić. – GPGVM

+0

czy kiedykolwiek chciałbyś, aby nieruchomość była czymś innym niż tylko do odczytu. IE nie ma sytuacji, w której chciałbyś ustawić ją inaczej niż za pośrednictwem konstruktora? – GPGVM

+0

@ user1278561: Istnieją dwa możliwe przypadki: (1) Klasa, która podnosi zdarzenie i tworzy instancję, chce zmienić tę właściwość. To się nie stanie, ponieważ instancja nie jest nigdzie zapisana, jest bezpośrednio przekazywana do obsługi. (2) Program obsługi zdarzeń chce zmienić tę właściwość. Nie chcesz tego robić, ponieważ inni subskrybenci wydarzenia otrzymają teraz inną instancję niż ta, którą podała klasa podnoszenia. –

3

Cóż, możesz zrobić to wszystko lub zdefiniować delegata jako EventHandler i zdefiniować swoje właściwości w jego podpisie.

Takich jak: publiczny delegat unieważnia MyEventEventHandler (int prop1, string prop2, object prop3 ...);

wydarzenie publiczne MyEventEventHandler MyEvent;

+1

Znacznie czystsze i wydajniejsze IMHO –

Powiązane problemy