C # benutzerdefinierte Event-Handler
-
03-07-2019 - |
Frage
Wenn ich eine Eigenschaft:
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?
Lösung
Sie sollten die System.ComponentModel.BindingList , speziell das Listchanged Ereignis .
Andere Tipps
Ein Binding ist wahrscheinlich die beste Wahl, da es builtin Änderungsverfolgung und eine Vielzahl von vorhandenen Veranstaltungen hat Sie verwenden kann. Unten ist ein Beispiel für ein benutzerdefiniertes Ereignis Hinzufügen des Aussetzens der das Binding 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);
}
}
Eine Alternative zu Binding ist ObservableCollection - in diesem Fall, dass Sie‘ d will Ihre eigenen Event-Handler an das Collection Ereignis abonnieren und Feuer Ihrer Ereignis in Abhängigkeit von der Aktion.
David Mohundro zeigt einen Ansatz; eine andere Option ist, von Collection
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önnten Sie Ihre eigene Liste (IList, IList
Ein nicht-orthodoxer Ansatz könnte unter Verwendung eines AOP Framework wie Postsharp sein, „webt“ einen Handler vor / nach der Accessor aufgerufen wird, die ein Ereignis ausgelöst wird.
Sie eine externe Klasse erstellen, die die pre und / oder Post Behandlungscode für, wenn Ihr Eigentum zugegriffen wird, prüfen, ob der Wert der Eigenschaft zwischen Pre- und Post geändert, und ein Ereignis auslösen.
Beachten Sie, dass, während der Wert für den Vergleich nehmen (in Ihrem Handler-Code), können Sie in eine Endlosschleife bekommen könnte (Sie Eigenschaftenaccessor nennen, die die AOP-Handler aufruft, die den Accessor ruft und so weiter), so Sie müssen möglicherweise in die Klasse reflektieren diese Eigenschaft mit dem dahinter liegenden Feld zu erreichen.
Sie müssen nicht die Liste aussetzen direkt als Eigenschaft und vielleicht Ihre Klasse implementieren IList oder so dann Ihr Event-Handler Feuer hat auf Add () -Methode.