2012-02-21 2 views
2

이것은 그리 많은 질문이 아니며, 이상한 것으로 나를 때리는 것보다 많습니다. ObservableCollection 클래스는 일반적이지만 컬렉션으로 바뀌면 발생하는 CollectionChanged 이벤트가 발생하지 않습니다. 즉, 이벤트 핸들러 내에서 이벤트 args 객체에서 가져온 NewItems/OldItems 컬렉션의 모든 객체를 적절한 항목 유형으로 직접 캐스팅해야합니다.C# : ObservableCollection - 일반 "CollectionChanged"이벤트가없는 이유는 무엇입니까?

하지만 단순히 해당 이벤트를 일반화 할 수 없었습니까?

public delegate void NotifyCollectionChangedEventHandler(object sender, NotifyCollectionChangedEventArgs<T> e); 

모든 후 다음

public class NotifyCollectionChangedEventArgs<T> { 
    // ... 
    public IList<T> NewItems { get; } 
    public IList<T> OldItems { get; } 

public virtual event NotifyCollectionChangedEventHandler<T> CollectionChanged; 

같은 뭔가가 형식 매개 변수 T은 이미 안 의미 문제의 ObservableCollection의 선언에 의해 결정됩니다 어쨌든 형식에 T (또는 호환 가능)이 아닌 객체를 컬렉션에 추가 할 수 있습니다. 따라서이 모든 것은 완벽하게 유형을 안전하게해야하며 이벤트 처리기 내부의 객체를 어쨌든 가져야하는 유형으로 캐스팅해야하는 번거 로움을 덜어줍니다.

실종 신고를하지 않는 이유가 있습니까? 나는. 이것은 의식적인 디자인의 욕망입니까, 아니면 그냥 감독입니까?

+1

만약 내가 올바르게 (하지만 아주 잘 못 들었을 수도 있습니다) 이것은 제네릭과 작동 할 수 없었던 WPF와 관련이 있었지만 컬렉션 변경을 청취하는 방법을 알아야했습니다 (ObservableCollection은 WPF 기본적으로 그렇게 함) – Polity

답변

-1

INotifyCollectionChanged 인터페이스는 INotifyPropertyChanged과 함께 WPF 프레임 워크 전용으로 설계되었습니다. WPF는 느슨하게 입력 되었기 때문에 제네릭이 그 디자인의 일부가 아니라고 생각합니다. 나는 INotifyCollectionChanged가 직접 소비되도록 고안된 것은 아니라고 생각합니다. 반면에 ObservableCollection<T>은 강력한 형식의 C# 코드에서 사용하도록 디자인되었으므로 디자인에 등장한 제네릭입니다.

+4

'INotifyPropertyChanged'는 .NET 2.0에서 소개되었으므로 WPF 전용으로 설계된 것은 아닙니다. – Lukazoid

+0

INotiftPropertyChanged는 원래 Windows 양식의 데이터 바인딩을 위해 IErrorInfo 측면에 도입되었습니다. 바인딩 원본은 'Object'유형 만 처리합니다. –

관련 문제