2008-10-20 18 views
7

Wenn ich eine Eigenschaft haben:C# benutzerdefinierte Ereignishandler

public list<String> names { get; set; } 

Wie kann ich generieren und ein benutzerdefiniertes Ereignis für Argumente willen onNamesChanged "genannt behandeln, wenn ein Name in die Liste aufgenommen wird?

Antwort

-1

Sie benötigen, um die Liste nicht aussetzen direkt als Eigenschaft und haben vielleicht Ihre Klasse IList oder so dann Ihre Event-Handler Feuer haben auf Add() -Methode implementieren.

+0

Das ist so .NET 1.1 :) Wie Marc Gravell sagte ... viel Arbeit, wenig Nutzen. –

0

David Mohundro zeigt einen Ansatz; eine andere Option ist, aus Sammlung <T> und außer Kraft setzen, die verschiedenen Methoden erben:

class Foo {} 
class FooCollection : Collection<Foo> 
{ 
    protected override void InsertItem(int index, Foo item) 
    { 
     // your code... 
     base.InsertItem(index, item); 
    } 
    protected override void SetItem(int index, Foo item) 
    { 
     // your code... 
     base.SetItem(index, item); 
    } 
    // etc 
} 

Schließlich können Sie Ihre eigene Liste erstellen könnte (IList, IList <T>) aus ersten Prinzipien - viel Arbeit, wenig Nutzen .

13

Ein Binding ist wahrscheinlich die beste Wahl, da es builtin Änderungsverfolgung und eine Vielzahl von vorhandenen Veranstaltungen hat 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.


    class Example 
    { 
     private BindingList<string> m_names = new BindingList<string>(); 
     public IEnumerable<string> Names { get { return m_names; } } 
     public event AddingNewEventHandler NamesAdded 
     { 
      add { m_names.AddingNew += value; } 
      remove { m_names.AddingNew -= value; } 
     } 
     public void Add(string name) 
     { 
      m_names.Add(name); 
     } 
    } 
+1

Dang. Ich lerne heute eine andere neue Sache. :) –

+1

Whoa, ich wusste nicht, dass Sie mit Ereignissen tun könnte! Das ist ziemlich glatt! –

+1

Sehr nett. Ich hatte keine Ahnung, dass das möglich war. – Steve

10

Eine Alternative zu Binding ist ObservableCollection - in diesem Fall, dass Sie mögen, würden Sie Ihre eigenen Event-Handler zum CollectionChanged Ereignisse abonnieren und Ihre Veranstaltung auf der Aktion in Abhängigkeit feuern.

+0

Noch eine Abstimmung hier. Ich kann immer noch nicht aufhören zu lernen :) –

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 die vor und/oder Postleitzahl Behandlung für Ihr Eigentum zugegriffen wird, prüfen, ob der Wert der Eigenschaft zwischen Pre- und Post geändert, und ein Ereignis auslösen.

Bedenken Sie, dass Sie während der Übernahme des Werts für den Vergleich (innerhalb Ihres Handler-Codes) in eine Endlosschleife gelangen können (Sie rufen den Property-Accessor, der den AOP-Handler aufruft, der den Accessor aufruft usw.), Daher müssen Sie möglicherweise in die Klasse mit dieser Eigenschaft reflektieren, um das Hintergrundfeld zu erreichen.