J'ai un PRISM RegionManager avec un couple de la région - une région de ruban sur le dessus, et une zone de contenu principale pour moi en dessous - assez basique.WPF événement PRISM SOUSCRIPTION ne pas mourir
L'application commence par une vue « à domicile » dans la zone de contenu principal. Lorsque je clique sur un bouton du ruban, j'injecte une deuxième vue dans la zone de contenu et y navigue dans le gestionnaire de région. Lorsque je clique sur un bouton de cette vue, il doit être supprimé et la vue d'origine doit être affichée.
que je fais actuellement ce en utilisant la méthode RegionManager.Add() pour ajouter manuellement la seconde vue. Lorsque je veux le supprimer, je publie un événement qui est consommé par une classe de gestionnaire qui obtient la suppression active en cours, appelle Remove() sur le gestionnaire de région pour cela, puis retourne à la vue d'origine.
Tout cela fonctionne très bien, sauf que lorsque la seconde vue est laissée en vie après que j'appelle remove(), et maintient une poignée sur les souscriptions qu'elle a fait au cours de sa vie! J'ai essayé d'appeler Subscribe explicitement avec false pour les références d'événements faibles, mais il s'agit de la valeur par défaut de toute façon, et cela n'a pas aidé. J'ai essayé les deux types de création de la vue (découverte et injection) et la suppression de la vue via Supprimer et Désactiver. Aucun d'eux n'a aidé. C'est un vrai problème car quand je veux créer la même vue dans le futur (une nouvelle instance de cette vue), il me reste plusieurs instances, toutes souscrites aux mêmes événements, même si certaines de ces instances étaient enlevé il y a des années du gestionnaire de région.
Ai-je besoin de vous désabonner manuellement de chaque événement que je souscris à mon point de vue (très indésirable)? Ou y a-t-il un moyen pour que je puisse disposer du contrôle/le marquer comme désactivé afin que ses abonnements soient supprimés?
J'ai l'impression que je fais ici quelque chose de stupide, mais il est complètement déconcerté m'a fait.
Merci
Merci pour le heads up - juste lire à travers ce poste et ont trouvé ce bogue et utilisé la solution proposée - alors que ce oblige PRISM à utiliser une référence faible, malheureusement je continue à avoir le même comportement :-( –
Je l'ai regardé un peu plus, je pense que ce genre de problème est plus fondamental - si tu attends assez longtemps, les références faibles sont supprimées du service d'abonnement à l'événement, mais si elles n'ont pas été effacées - et vous ne pouvez jamais savoir quand cela sera fait - alors les anciens abonnements peuvent rester cachés, en écoutant toutes sortes d'événements. Je pense que je devrai soit me désabonner manuellement de n'importe quel événement à chaque fois que je ferme une vue, soit réutiliser des instances uniques d'une vue plutôt que de créer de nouvelles instances. Ni l'un ni l'autre ne m'attire beaucoup. –
@Isaac Abraham: c'est parce que quand une référence faible est maintenue, elle est toujours valide jusqu'à ce que le garbage collector arrive et nettoie cet objet. Si vous voulez vous désinscrire immédiatement, vous devrez malheureusement vous désabonner manuellement. –