2011-02-16 3 views
7

ObservableCollection과 같은 특수 컬렉션을 구현하여 더 많은 메커니즘을 캡슐화했으며, 이는 내 컬렉션이 Collection에서 상속되도록하고 동일한 인터페이스도 구현합니다.ObservableCollection은 어떻게 작동합니까? <T>.Add가 작동합니까?

하나가 실제로 예를 Collection<T>.Add 위해 (이 경우에도 가상으로 표시되지 않음) 오버라이드 (override)되지 않고, 전체 컬렉션 변경 로직을 구현, 그래서 어떻게 난 그냥 생각하지 않는 항목 경우 ObservableCollection의 화재 CollectionChanged 이벤트를 수행하는 방법 그 방법을 사용하여 추가 되었습니까?

답변

10

특정 질문에 대한 답변을 얻으려면 Collection<T>.AddInsertItem 가상 메서드를 호출합니다 (컬렉션이 읽기 전용이 아닌지 확인한 후). ObservableCollection<T> 실제로 삽입을 수행하는이 메서드를 재정 의하여 관련 변경 알림을 발생시킵니다.

+0

아 에 볼 수있는 InsertItem를 호출하여 그렇게! (당신도 그것을 어떻게 알 수 있습니까?) –

+1

@ H.B., [Reflector] (http://www.red-gate.com/products/dotnet-development/reflector/)에 대해 들어 보셨습니까? –

+0

@Darin 나는 가지고있다 그러나 그들은 돈을 지금 요하고 내 시스템에 사본을 남기면 그들은 나를 사냥 할 것이라고 말했다 http://tirania.org/blog/archive/2011/Feb-04.html –

0

키는 기본 Collection 메서드를 재정의하는 것이 아니라 ICollection 인터페이스를 구현한다는 점에 유의하십시오. 솔직히 Collection 클래스에서 상속하는 대신 생성자에서 ICollection을 사용하는 어댑터 클래스를 만드는 것이 좋습니다. 그러면 메서드가 내부 컬렉션에 위임하고 적절한 이벤트를 발생시킵니다.

8

그것은 그 작품을 다시 한 번 감사 방법, 그래서 오버라이드 (override) 및 디 컴파일

protected override void InsertItem(int index, T item) 
{ 
    this.CheckReentrancy(); 
    base.InsertItem(index, item); 
    this.OnPropertyChanged("Count"); 
    this.OnPropertyChanged("Item[]"); 
    this.OnCollectionChanged(NotifyCollectionChangedAction.Add, item, index); 
} 
+0

감사합니다. Ani는 더 빨랐습니다. 그래서 나는이 사람을 그/그녀에게 건네주었습니다. –