2011-02-16 11 views
7

ObservableCollection gibi çalışan özel bir koleksiyon, bazı mekanizmaları kapsüllemek ve Collection numaralı koleksiyondan devralmamı ve aynı arabirimleri de kullanmamı sağlamak için çalışıyor.ObservableCollection <T> Nasıl çalışır?

biri aslında örneğin Collection<T>.Add için (hatta sanal olarak işaretlenmemiş) kılınmasını değil, bütün koleksiyon-değişmiş-mantığı uygulayan, böylece nasıl sadece olsa alamadım öğeler eğer ObservableCollection yangın CollectionChanged olayı nasıl yaptığını Bu yöntem kullanılarak eklenmiştir?

cevap

10

Özel sorunuzu yanıtlamak için Collection<T>.Add, InsertItem sanal yöntemini çağırır (koleksiyonun salt okunur olmadığını kontrol ettikten sonra).gerçekten de bu yöntemi ve ekleme yapmak için geçersiz kılar ve ilgili değişiklik bildirimlerini artırır.

+0

Ah üzerine görülebilir hangi InsertItem çağırarak yapar! (Bunu nereden biliyorsunuz?) –

+1

@ H.B., [Reflektör] 'ün (http://www.red-gate.com/products/dotnet-development/reflector/) haberini aldınız mı? –

+0

@Darin Ben şimdi paraya mal olduğunu söylediler ve sistemimde bir kopyasını bırakırsam beni avlayacaklar http://tirania.org/blog/archive/2011/Feb-04.html –

0

Unutmayın, anahtar, Temel Toplama yöntemlerini geçersiz kılmıyor, ICollection arabirimini uygulayacağınız gerçeğidir. Ve açıkçası, bir Koleksiyon sınıfından miras almak yerine, kurucuda bir ICollection alan bir adaptör sınıfı oluşturmanızı öneririm ve yöntemleriniz sadece iç koleksiyona delege eder ve uygun olayları ortaya çıkarır.

8

O çalıştığını bir kez daha teşekkür ederim nasıl yani, geçersiz kılınır ve ayrıştırma

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

Teşekkür ederim, Ani daha hızlıydı, bu yüzden ona bir tane verdim. –