Frage

Ich habe den folgenden Code die GUI reagieren auf eine Änderung in der Sammlung zu lassen.

myObservableCollection.CollectionChanged += ((sender, e) => UpdateMyUI());

Zunächst einmal ist dies ein guter Weg, dies zu tun?

Zweitens: Was ist der Code von diesem Event abmelden? Ist es die gleiche, aber mit - = (und dann der kompletten anonymen Methode wieder)

War es hilfreich?

Lösung

Wenn Sie eine Veranstaltung austragen müssen, benötigen Sie einen instanzierten Referenz. Leider, das bedeutet, dass Sie nicht diese spezielle Syntax verwenden können.

Andere Tipps

Zunächst einmal ... ja, es ist ein guter Weg, es zu tun, es ist sauber, kleine Form und leicht zu lesen und verstehen ... die Einschränkung natürlich ist „Wenn Sie später annullieren“.

Ich glaube, Jon Skeet vorher darauf hingewiesen, „Die Spezifikation nicht explizit das Verhalten oder so garantieren, wenn es um die Gleichwertigkeit der Delegierten kommt mit anonymen Methoden erstellt.“

Wenn Sie also von der Veranstaltung austragen müssen zu einem späteren Zeitpunkt, würden Sie am besten sein, um tatsächlich eine Delegate-Instanz zu erstellen, so dass Sie für später auf die Referenz hängen kann.

var myDelegate = delegate(sender, e){UpdateMyUI()};

myObservableCollection.CollectionChanged += myDelegate;

myObservableCollection.CollectionChanged -= myDelegate;

Es ist ein oker Weg zu gehen, es sei denn, myObservableCollection länger leben wird als ‚dies‘, wobei in diesem Fall könnten Sie mit einem Speicherverlust, als Delegierter am Ende, die hinter den Kulissen erstellt wird, wird einen Verweis auf Ihren konservieren " diese, die sie am leben halten werden. Wenn Sie immer wieder schaffen und ‚zerstören‘, was auch immer auf das Ereignis wartet, werden Sie feststellen, dass sie nicht vom Garbage Collector gesammelt werden.

Wenn dies ein Problem ist, können Sie die Route in den Antworten vorgeschlagen gehen, einen Verweis auf die Handler Erhaltung, die Sie zuerst erstellen müssen.

Ein andere Lösung ist schwachen Verweis zu verwenden, um einen Ereignishandler zu erstellen, die die Teilnehmer gesammelt werden können, wenn nicht andere Referenzen sind. Ich habe diese Lösung in und Antwort .

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