2011-02-16 83 views
7

我試圖實現一個專門的集合,像ObservableCollection那樣封裝一些更多的機制,爲此我也讓我的集合繼承自Collection,我也實現了相同的接口。ObservableCollection <T> .Add如何工作?

我只是不明白,雖然一個人如何真正實現全收集改變的邏輯,例如Collection<T>.Add沒有被覆蓋(它甚至沒有標記爲虛擬的),那麼如何ObservableCollectionCollectionChanged事件如果項目是使用該方法添加的?

回答

10

要回答您的具體問題,Collection<T>.Add將調用InsertItem虛擬方法(在檢查收集不是隻讀後)。 ObservableCollection<T>確實會覆蓋此方法來執行插入以提高相關的更改通知。

+0

阿中可以看出,所以這是如何工作的,再次感謝你這樣做! (你怎麼知道的?) – 2011-02-16 22:14:01

+1

@ H.B。,你有沒有聽說過[Reflector](http://www.red-gate.com/products/dotnet-development/reflector/)? – 2011-02-16 22:16:13

0

請記住,關鍵並不在於覆蓋基本的Collection方法,事實上,您將實現ICollection接口。坦率地說,我不建議從Collection類繼承,而是建議在構造函數中創建一個接受ICollection的適配器類,並且您的方法將委託給內部集合並引發適當的事件。

8

它通過調用InsertItem被覆蓋,並且可以在編譯

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); 
}