Как работает ObservableCollection <T>.Add? - PullRequest
7 голосов
/ 17 февраля 2011

Я пытался реализовать специализированную коллекцию, которая работает как ObservableCollection, чтобы инкапсулировать в нее еще несколько механизмов, для этого я также позволяю моей коллекции наследоваться от Collection, и я также реализую те же интерфейсы.1004 * Я просто не понимаю, как на самом деле реализуется вся логика изменения коллекции, например, Collection<T>.Add не переопределяется (даже не помечается как виртуальная), так как же ObservableCollection запускает * 1007?* событие, если элементы были добавлены с использованием этого метода?

Ответы [ 3 ]

10 голосов
/ 17 февраля 2011

Чтобы ответить на ваш конкретный вопрос, Collection<T>.Add вызывает виртуальный метод InsertItem (после проверки, что коллекция не только для чтения). ObservableCollection<T> действительно переопределяет этот метод для вставки и для получения соответствующих уведомлений об изменениях.

8 голосов
/ 17 февраля 2011

Это делается путем вызова 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);
}
0 голосов
/ 17 февраля 2011

Помните, что ключ не в переопределении базовых методов Collection, а в том, что вы будете реализовывать интерфейс ICollection.И, честно говоря, вместо того чтобы наследовать от класса Collection, я бы предложил вместо этого создать класс адаптера, который принимает ICollection в конструкторе, а ваши методы просто делегируют внутреннюю коллекцию и вызывают соответствующие события.

...