我試圖實現一個專門的集合,像ObservableCollection
那樣封裝一些更多的機制,爲此我也讓我的集合繼承自Collection
,我也實現了相同的接口。ObservableCollection <T> .Add如何工作?
我只是不明白,雖然一個人如何真正實現全收集改變的邏輯,例如Collection<T>.Add
沒有被覆蓋(它甚至沒有標記爲虛擬的),那麼如何ObservableCollection
火CollectionChanged
事件如果項目是使用該方法添加的?
我試圖實現一個專門的集合,像ObservableCollection
那樣封裝一些更多的機制,爲此我也讓我的集合繼承自Collection
,我也實現了相同的接口。ObservableCollection <T> .Add如何工作?
我只是不明白,雖然一個人如何真正實現全收集改變的邏輯,例如Collection<T>.Add
沒有被覆蓋(它甚至沒有標記爲虛擬的),那麼如何ObservableCollection
火CollectionChanged
事件如果項目是使用該方法添加的?
要回答您的具體問題,Collection<T>.Add
將調用InsertItem
虛擬方法(在檢查收集不是隻讀後)。 ObservableCollection<T>
確實會覆蓋此方法來執行插入和以提高相關的更改通知。
請記住,關鍵並不在於覆蓋基本的Collection方法,事實上,您將實現ICollection接口。坦率地說,我不建議從Collection類繼承,而是建議在構造函數中創建一個接受ICollection的適配器類,並且您的方法將委託給內部集合並引發適當的事件。
它通過調用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);
}
阿中可以看出,所以這是如何工作的,再次感謝你這樣做! (你怎麼知道的?) – 2011-02-16 22:14:01
@ H.B。,你有沒有聽說過[Reflector](http://www.red-gate.com/products/dotnet-development/reflector/)? – 2011-02-16 22:16:13