Como funciona ObservableCollection<T>.Add?
-
14-11-2019 - |
Pergunta
Eu estava tentando implementar uma coleção especializada que funcionasse como ObservableCollection
para encapsular mais alguns mecanismos nele, para fazer isso eu também deixei minha coleção herdar de Collection
e também implemento as mesmas interfaces.
Eu simplesmente não entendo como alguém realmente implementa toda a lógica de mudança de coleção, por exemplo Collection<T>.Add
não está sendo substituído (nem mesmo está marcado como virtual), então como o ObservableCollection
disparar o CollectionChanged
evento se os itens foram adicionados usando esse método?
Solução
Para responder à sua pergunta específica, Collection<T>.Add
chama o InsertItem
método virtual (depois de verificar se a coleção não é somente leitura). ObservableCollection<T>
na verdade substitui este método para fazer a inserção e gerar as notificações de alteração relevantes.
Outras dicas
Isso é feito ligando InsertItem
que é substituído e pode ser visto na descompilação
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);
}
Lembre-se, a chave não está em substituir os métodos básicos da coleção, mas no fato de você implementar a interface ICollection.E, francamente, em vez de herdar de uma classe Collection, eu sugeriria criar uma classe adaptadora que receba uma ICollection no construtor e seus métodos apenas delegarão para a coleção interna e gerarão os eventos apropriados.