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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top