좋아, 그래서 개체에 INotifyCollectionChanged
속성을 연결하는 첨부 된 속성 (정적 클래스에서 선언 된)이 있습니다.첨부 된 속성에 저장된 컬렉션의 CollectionChanged 이벤트 구독 취소
속성을 설정하면 변경 내용을 모니터링하기 위해 컬렉션을 시작한 다음 컬렉션이 연결된 개체에 몇 가지 작업을 수행하려고합니다..
첫 번째 시도 : 컬렉션이 핸들러에 부착 된 객체를 얻기 위하여
private static void MyProperty_OnChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
// We need both the dependency object, and the collection args to process the notification
NotifyCollectionChangedEventHandler changedFunc = (sender, eventArgs) => MyProperty_OnCollectionChanged(d, sender, eventArgs);
if(e.OldValue != null)
e.OldValue.CollectionChanged -= changedFunc; // Can you see the bug?
if(e.NewValue != null)
e.NewValue.CollectionChanged += changedFunc;
}
, 나는 폐쇄에 d
당깁니다. 충분히 쉽지, 그렇지?
글쎄, 여기 버그를 볼 수있을 것입니다. changedFunc가 다른 클로저를 가진 새로운 핸들러이기 때문에 컬렉션이 제거되거나 새 컬렉션으로 대체되면 이벤트 핸들러의 등록을 취소하지 못합니다.
그럼 어떻게해야할까요?
첨부 된 속성이므로 처리기를 구성원으로 저장할 수있는 클래스가 없습니다. 현재 _another_ 객체를 _another_ 속성에 저장하고 있습니다 만이 문제를 해결할 수 있지만 더 깨끗한 솔루션을 찾고 있습니다. – Mark
또한 "내"컬렉션이 아닙니다. 연결된 속성은 모든 INotifyCollectionChanged 구현 객체와 함께 작동해야합니다. – Mark