2009-12-14 4 views
0

J'ai un ObserableCollection avec des éléments, qui implémentent l'interface INotifyPropertyChanged. Voici comment je le crée:C#: Supprimer des événements de ObservableCollection?

 var myCollection = new ObservableCollection<MyViewModel>(); 
     myCollection.CollectionChanged += OnCollectionChanged; 

_

 private void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
     { 
      if (e.NewItems != null) 
      { 
       if (e.Action == NotifyCollectionChangedAction.Remove) 
       { 
        foreach (ViewModelBase item in e.NewItems) 
        { 
         item.PropertyChanged -= myViewModelPropertyChanged; 
        } 
       } 
       else if (e.Action == NotifyCollectionChangedAction.Add) 
       { 
        foreach (ViewModelBase item in e.NewItems) 
        { 
         item.PropertyChanged += myViewModelPropertyChanged; 
        } 
       } 
      } 
     } 

Maintenant, ma question est, doi besoin de caniveau en boucle tous les articles et enlever le "myViewModelPropertyChanged" avant de faire une autre

myCollection = new ObservableCollection<MyViewModel>(); 

ou est-ce que cela se produit automatiquement? Qu'en est-il un myCollection.Clear();

Merci pour toute contribution.

Vive Joseph

Répondre

3

Si je comprends bien, vous avez une collection d'objets. Pour chaque objet, vous avez souscrit à certains événements membres. Maintenant, votre objet a une référence à vos fonctions de gestionnaire. Lorsque vous effacez la collection, si personne d'autre ne référence les objets membres, vous n'avez pas besoin de vous désabonner explicitement. Les objets recevront des ordures collectées.
Le problème se produit lorsque l'éditeur survit à l'abonné, auquel cas il maintient l'abonné en vie en raison des références du gestionnaire d'événements/délégué. par exemple. Si vous stockez l'éditeur dans un champ statique, si vous ne vous désinscrivez pas explicitement, l'abonné ne sera pas collecté par le GC.

Voir aussi: 1198076 et d'autres questions connexes.

0

Je pense qu'une myCollection.Clear(); ou créer un nouveau myCollection sur l'ancien ne sera pas dissocier les objets de votre collection de l'événement, et puis je ferais l'itération

Questions connexes