2013-02-20 8 views
21

Ich habe eine Benutzersteuerung, die ein Ereignis nach der Kommunikation mit einem Webdienst auslöst. Das übergeordnete Element behandelt dieses Ereignis, wenn es ausgelöst wird. Was ich dachte wäre der richtige Ansatz wäre, das Objekt aus dem Webservice an die Eltern übergeben als eventargs ???Wie übergebe ich Objekte in EventArgs

Wenn dies der richtige Weg ist, kann ich nicht die Anweisungen finden, wie dies zu tun ist. später, nachdem der Dienst kehrt biz Objekt

Usercontrol

public event EventHandler LoginCompleted; 

dann:

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

Eltern

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

Also meine Frage ist, was wäre die "genehmigte" Methode, um das Benutzerobjekt zurück zum Elternteil zu bekommen? Erstellen Sie eine Eigenschaftsklasse, auf die alles zugreifen kann, und legen Sie sie dort ab?

Antwort

35

Sie müssen Ihre Veranstaltung EventHandler<T> mit erklären würde, wo T Ihre Klasse, die von EventArgs ableitet:

public event EventHandler<LoginCompletedEventArgs> LoginCompleted; 

LoginCompletedEventArgs könnte wie folgt aussehen:

public class LoginCompletedEventArgs : EventArgs 
{ 
    private readonly YourBusinessObject _businessObject; 

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

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

Verwendung so sein würde:

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

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

Bitte beachten Sie, wie ich RaiseLoginCompleted implementiert habe. Dies ist eine Thread-sichere Version des Ereignisses. Ich eliminiere eine mögliche NullReferenceException, die in einem Race-Condition-Szenario auftreten kann, in dem ein Thread das Ereignis auslösen möchte und ein anderer Thread den letzten Handler nach der if Prüfung abbestellt, aber bevor der Handler tatsächlich aufgerufen wird.

+0

Das ist das Ticket! Lassen Sie mich implementieren und gleich zurückkommen. – GPGVM

+0

würden Sie jemals wollen, dass die Eigenschaft alles andere als nur lesen. IE gibt es nie eine Situation, wo Sie es anders als über Konstruktor setzen möchten? – GPGVM

+0

@ user1278561: Es gibt zwei mögliche Fälle: (1) Die Klasse, die das Ereignis auslöst und die Instanz erstellt, möchte diese Eigenschaft ändern. Das wird nicht passieren, da die Instanz nirgends gespeichert wird und direkt an den Handler übergeben wird. (2) Der Event-Handler möchte diese Eigenschaft ändern. Dies möchten Sie nicht tun, da andere Abonnenten des Ereignisses jetzt eine andere Instanz erhalten als die, die die aufsteigende Klasse bereitgestellt hat. –

3

Nun, Sie könnten das alles tun, oder Sie könnten einen Delegaten als EventHandler definieren und Ihre Eigenschaften in seiner Signatur definieren.

Zum Beispiel: öffentlicher Delegat void MyEventEventHandler (int prop1, Zeichenfolge prop2, Objekt prop3 ...);

Öffentliche Veranstaltung MyEventEventHandler MyEvent;

+1

Viel sauberer und effizienter IMHO –

Verwandte Themen