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?

War es hilfreich?

Lösung

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 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önnten Sie Ihre eigene Liste (IList, IList ) aus ersten Prinzipien schaffen -. Viel Arbeit, wenig Nutzen

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top