Question

J'ai le code suivant pour laisser l'interface graphique répondre à un changement dans la collection.

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

Tout d’abord, est-ce un bon moyen de le faire?

Deuxièmement: quel est le code pour se désabonner de cet événement? Est-ce la même chose mais avec - = (puis à nouveau la méthode anonyme complète)?

Était-ce utile?

La solution

Si vous devez vous désabonner d'un événement, vous avez besoin d'une référence instanciée. Malheureusement, cela signifie que vous ne pouvez pas utiliser cette syntaxe particulière.

Autres conseils

Tout d’abord ... oui, c’est un bon moyen de le faire, c’est propre, de petite taille et facile à lire & amp; comprendre ... la mise en garde est bien sûr "à moins que vous ne souhaitiez plus tard vous désabonner".

Je crois que Jon Skeet a été signalé auparavant. "La spécification ne garantit pas explicitement le comportement des deux côtés en ce qui concerne l'équivalence des délégués créés avec des méthodes anonymes."

Ainsi, si vous devez vous désabonner de l'événement ultérieurement, vous feriez mieux de créer une instance de délégué afin de pouvoir conserver la référence plus tard.

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

myObservableCollection.CollectionChanged += myDelegate;

myObservableCollection.CollectionChanged -= myDelegate;

C’est une bonne façon de procéder, à moins que myObservableCollection vive plus longtemps que 'this', auquel cas vous pourriez vous retrouver avec une fuite de mémoire, car le délégué créé en coulisse conservera une référence à votre ' ceci, qui le gardera en vie. Si vous créez et «détruisez» à plusieurs reprises tout ce qui écoute l'événement, vous constaterez qu'il n'est pas collecté par le ramasse-miettes.

Si cela pose un problème, vous pouvez suivre la route proposée dans les réponses, en conservant une référence au gestionnaire, que vous devez créer en premier.

Une autre solution consiste à utiliser des références faibles pour créer un gestionnaire d'événements qui permettra à l'abonné d'être collecté s'il n'y a pas d'autres références. J'ai exploré cette solution dans cette question et cette réponse .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top