2009-12-14 4 views
0

INotifyPropertyChanged 인터페이스를 구현하는 항목이있는 ObserableCollection이 있습니다. 이다 내가 그것을 만드는 방법 :C# : 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; 
        } 
       } 
      } 
     } 

지금 내 질문은, DOI는 루프 저점 모든 항목을 다른

myCollection = new ObservableCollection<MyViewModel>(); 
를 수행하기 전에 "myViewModelPropertyChanged"을 제거해야한다

또는 자동으로 발생합니까? 무엇에 대해 myCollection.Clear();

입력 해 주셔서 감사합니다.

건배 조셉

답변

3

정확하게 이해하면 객체 컬렉션이 있습니다. 각 개체에 대해 일부 멤버 이벤트를 구독했습니다. 이제 개체에는 처리기 함수에 대한 참조가 있습니다.

컬렉션을 지울 때 다른 사람이 구성원 개체를 참조하지 않으면 명시 적으로 구독을 취소 할 필요가 없습니다. 개체가 가비지 수집됩니다.
게시자가 구독자보다 오래 걸리면 문제가 발생합니다.이 경우 구독자는 이벤트 처리기/위임자 참조으로 인해 구독자를 계속 유지합니다. 예 : 정적 필드에 게시자를 저장하면 명시 적으로 구독을 취소하지 않으면 구독자가 GC에 의해 수집되지 않습니다.

다음을 참조하십시오 : 1198076 및 기타 관련 질문.

0

내가 생각하는 myCollection.Clear(); 또는 이전에 새 myCollection을 만들면 이벤트 컬렉션에 대한 객체의 연결이 끊어지지 않고 반복됩니다.

관련 문제