2010-03-23 4 views
0

Dans mon application WPF, j'ai une View qui reçoit un ViewModel, et lorsque cette vue est affichée, elle ajoute des gestionnaires d'événements à l'événement PropertyChanged de ViewModel. Lorsque certaines actions se produisent dans l'interface graphique, je supprime la vue et ajoute une autre vue au conteneur de stockage - où ce nouveau est lié au même ViewModel. Après cela, l'ancienne vue continue de gérer les événements PropertyChanged dans ViewModel. Je suppose que cela se produit parce que la vue n'a pas encore été collectée par le récupérateur de place, et est donc en vie? Eh bien, j'en ai besoin pour arrêter. Mon hypothèse est que j'ai besoin de détacher manuellement le gestionnaire d'événements à partir du ViewModel? Y at-il une meilleure pratique sur la façon de gérer cela?Stratégie de désabonnement des gestionnaires d'événements

Répondre

2

Peut-être que l'abonnement à l'événement Unloaded de la vue et son détachement dans le gestionnaire d'événements Unloaded sont un peu plus propres, les utilisateurs ne devraient pas non plus appeler Dispose().

+0

Merci! J'apprécie beaucoup mieux cette solution que la solution Dispose. – stiank81

+0

De MSDN: "Loaded et déchargé peuvent tous deux être déclenchés sur des contrôles à la suite de modifications de thème système initiées par l'utilisateur". Aussi, que se passe-t-il si vous décidez de détacher l'élément et de l'attacher à nouveau? Voulez-vous vous rappeler de reconfigurer les événements? – Zmaster

2

La stratégie que j'utilise consiste à rendre l'objet View IDposable et la fonction Dispose de la vue à désabonner les gestionnaires d'événements. Ensuite, la personne responsable de l'ajout de la vue doit d'abord appeler le Dispose() sur l'ancienne vue. Fonctionne comme un charme, mais est-ce une utilisation valide d'IDisposable?

Questions connexes