Вы можете использовать ObservableCollection<T>
для этой цели. Не нужно писать самому.
Кроме того: при создании подкласса Collection<T>
достаточно переопределить защищенные виртуальные методы. Все другие открытые методы будут вызывать их.
Если вы дополнительно скрываете не виртуальные, как вы, события могут запускаться несколько раз (и в вашем случае при очистке коллекции событие не будет запускаться).