C # benutzerdefinierte Event-Handler

7

Wenn ich eine Eigenschaft habe:

%Vor%

Wie kann ich ein benutzerdefiniertes Event für Argumente erzeugen und behandeln, das 'onNamesChanged' genannt wird, wenn ein Name zur Liste hinzugefügt wird?

    
TK. 20.10.2008, 12:52
quelle

6 Antworten

10

Sie sollten die System.ComponentModel.BindingList , insbesondere die ListChanged-Ereignis .

    
David Mohundro 20.10.2008, 12:57
quelle
13

Eine BindingList ist wahrscheinlich die beste Option, da sie eine Änderungsverfolgung und eine Vielzahl von vorhandenen Ereignissen enthält, die Sie verwenden können. Im Folgenden finden Sie ein Beispiel für das Einblenden eines benutzerdefinierten Ereignisses für "Hinzufügen", das zum BindingList-Ereignis weiterleitet.

%Vor%     
JaredPar 20.10.2008 13:06
quelle
10

Eine Alternative zu BindingList ist ObservableCollection - in diesem Fall möchten Sie Ihr Abo abonnieren eigene Event-Handler zum CollectionChanged -Ereignis und feuern Sie Ihr Event abhängig von der Aktion ab.

    
Jon Skeet 20.10.2008 13:08
quelle
0

David Mohundro zeigt einen Ansatz; eine andere Möglichkeit besteht darin, von Collection & lt; T & gt; und überschreiben Sie die verschiedenen Methoden:

%Vor%

Schließlich könnten Sie Ihre eigene Liste (IList, IList & lt; T & gt;) aus den ersten Prinzipien erstellen - viel Arbeit, wenig Nutzen.

    
Marc Gravell 20.10.2008 13:06
quelle
0

Ein nicht-orthodoxer Ansatz könnte ein AOP-Framework wie PostSharp verwenden, um einen Handler vor / nach dem Aufruf des Accessors zu "weben", der ein Ereignis auslöst.

Sie erstellen eine externe Klasse, die den Pre- und / oder Post-Handling-Code für den Zugriff auf Ihre Property enthält. Überprüfen Sie, ob sich der Wert der Property zwischen Pre und Post geändert hat und ein Ereignis ausgelöst wird.

Bedenken Sie, dass Sie während des Vergleichs (innerhalb Ihres Handler-Codes) möglicherweise in eine Endlosschleife gelangen (Sie rufen den Property-Accessor auf, der den AOP-Handler aufruft, der den Accessor usw. aufruft) Möglicherweise müssen Sie in die Klasse mit dieser Eigenschaft reflektieren, um das Hintergrundfeld zu erreichen.

    
Yoni Shalom 20.10.2008 13:33
quelle
-1

Sie müssen die Liste nicht direkt als Eigenschaft verfügbar machen und vielleicht müssen Ihre Klasse IList oder andere implementieren, damit Ihr Event-Handler die Add () - Methode auslöst.

    
Jesse C. Slicer 20.10.2008 12:55
quelle

Tags und Links