c# - Diferença entre ObservableCollection e BindingList




.net wpf (3)

A diferença prática é que BindingList é para WinForms, e ObservableCollection é para WPF.

Do ponto de vista do WPF, BindingList não é adequadamente suportado, e você nunca o utilizaria em um projeto WPF, a menos que você realmente precisasse.

Eu quero saber a diferença entre ObservableCollection e BindingList porque eu usei ambos para notificar qualquer alteração de adicionar / excluir no Source, mas eu realmente não sei quando preferir um sobre o outro.

Por que eu escolheria um dos seguintes sobre o outro?

ObservableCollection<Employee> lstEmp = new ObservableCollection<Employee>();

ou

BindingList<Employee> lstEmp = new BindingList<Employee>();

As diferenças mais importantes, como características e notificações de alteração sobre os elementos contidos, já são mencionadas pela resposta aceita, mas há mais, que também vale a pena mencionar:

atuação

Quando AddNew é chamado, BindingList<T> procura o item adicionado por uma pesquisa IndexOf . E se T implementa INotifyPropertyChanged o índice de um elemento alterado também é pesquisado por IndexOf (embora não haja nenhuma nova pesquisa, desde que o mesmo item seja alterado repetidamente). Se você armazenar milhares de elementos na coleção, ObservableCollection<T> (ou uma implementação personalizada IBindingList com custo de pesquisa O (1)) pode ser mais preferível.

Completude

  • A interface IBindingList é enorme (talvez não seja o design mais limpo) e permite que os implementadores implementem apenas um subconjunto de seus recursos. Por exemplo, as propriedades AllowNew , SupportsSorting e SupportsSearching informam se os AddNew , ApplySort e Find podem ser usados, respectivamente. Muitas vezes surpreende as pessoas que o BindingList<T> si não suporta a classificação. Na verdade, ele fornece alguns métodos virtuais, permitindo que as classes derivadas adicionem os recursos ausentes. A classe DataView é um exemplo de uma implementação completa do IBindingList ; no entanto, não é para coleções digitadas em primeiro lugar. E a classe BindingSource no WinForms é um exemplo híbrido: ela suporta a classificação se ela envolver outra implementação do IBindingList , que suporta a classificação.

  • ObservableCollection<T> já é uma implementação completa da interface INotifyCollectionChanged (que tem apenas um único evento). Ele também possui membros virtuais, mas ObservableCollection<T> é geralmente derivado pelo mesmo motivo que sua classe Collection<T> : para personalizar itens de adicionar / remover (por exemplo, em uma coleção de modelo de dados) em vez de ajustar recursos de ligação.

Copiar vs. envolvimento

Tanto ObservableCollection<T> como BindingList<T> possuem um construtor, que aceita uma lista já existente. Embora eles se comportem de maneira diferente quando são instanciados por outra coleção:

  • BindingList<T> atua como um wrapper observável para a lista fornecida, e as alterações realizadas no BindingList<T> também serão refletidas na coleção subjacente.
  • ObservableCollection<T> por outro lado passa uma nova instância List<T> para o construtor base Collection<T> e copia os elementos da coleção original para essa nova lista. Obviamente, se T for um tipo de referência, as alterações nos elementos serão visíveis a partir da coleção original, mas a coleção em si não será atualizada.

Um ObservableCollection pode ser atualizado da interface do usuário exatamente como qualquer coleção. A verdadeira diferença é bastante direta:

ObservableCollection<T> implementa INotifyCollectionChanged que fornece notificação quando a coleção é alterada (você adivinhou ^^) Permite que o mecanismo de ligação atualize a UI quando o ObservableCollection é atualizado.

No entanto, BindingList<T> implementa IBindingList .

IBindingList fornece notificação sobre alterações de coleção, mas não apenas isso. Ele fornece um monte de funcionalidades que podem ser usadas pela interface do usuário para fornecer muito mais coisas do que apenas atualizações de interface do usuário de acordo com as mudanças, como:

  • Classificação
  • Procurando
  • Adicionar através de fábrica (função AddNew member).
  • Lista somente leitura (propriedade CanEdit)

Todas estas funcionalidades não estão disponíveis no ObservableCollection<T>

Outra diferença é que BindingList retransmite notificações de alteração de item quando seus itens implementam INotifyPropertyChanged . Se um item gera um evento PropertyChanged , o BindingList irá recebê-lo e gera um ListChangedEvent com ListChangedType.ItemChanged e OldIndex=NewIndex (se um item foi substituído, OldIndex=-1 ). ObservableCollection não retransmite notificações de itens.

Observe que, no Silverlight, BindingList não está disponível como uma opção: você pode, no entanto, usar ObservableCollection ICollectionView (e IPagedCollectionView se bem me lembro).





wpf-4.0