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 interface do usuário quando ela ObservableCollection
é atualizada.
No entanto, BindingList<T>
implementa IBindingList
.
IBindingList
fornece notificação sobre alterações na coleção, mas não apenas isso. Ele fornece várias funcionalidades que podem ser usadas pela interface do usuário para fornecer muito mais coisas do que apenas atualizações da interface do usuário de acordo com as alterações, como:
- Ordenação
- Procurando
- Adicionar pela fábrica (função de membro AddNew).
- Lista somente leitura (propriedade CanEdit)
Todas essas funcionalidades não estão disponíveis no ObservableCollection<T>
Outra diferença é que BindingList
retransmite as notificações de alteração de itens quando seus itens são implementados INotifyPropertyChanged
. Se um item gerar um PropertyChanged
evento, BindingList
ele receberá um aumento ListChangedEvent
com ListChangedType.ItemChanged
e e OldIndex=NewIndex
(se um item foi substituído OldIndex=-1
). ObservableCollection
não retransmite as notificações do item.
Note que no Silverlight, BindingList
não está disponível como uma opção: No entanto, você pode usar ObservableCollection
s e ICollectionView
(e IPagedCollectionView
se me lembro bem).
BindingList
obsoleto?A diferença prática é que BindingList é para WinForms e ObservableCollection é para WPF.
De uma perspectiva do WPF, o BindingList não é suportado adequadamente e você nunca o utilizaria em um projeto WPF, a menos que fosse realmente necessário.
fonte
As diferenças mais importantes, como recursos e notificações de alterações sobre os elementos contidos, já são mencionadas na resposta aceita, mas há outras que também merecem destaque:
atuação
Quando
AddNew
é chamado,BindingList<T>
procura o item adicionado por umaIndexOf
pesquisa. E seT
implementaINotifyPropertyChanged
o índice de um elemento alterado também é pesquisado porIndexOf
(embora não haja nova pesquisa desde que o mesmo item seja alterado repetidamente). Se você armazenar milhares de elementos na coleção, será preferívelObservableCollection<T>
(ou umaIBindingList
implementação customizada com custo de pesquisa O (1)).Completude
A
IBindingList
interface é enorme (talvez não seja o design mais limpo) e permite que os implementadores implementem apenas um subconjunto de seus recursos. Por exemplo, asAllowNew
,SupportsSorting
eSupportsSearching
propriedades de dizer seAddNew
,ApplySort
eFind
métodos podem ser utilizados, respectivamente. Muitas vezes, surpreende as pessoas queBindingList<T>
não suportam a classificação. Na verdade, ele fornece alguns métodos virtuais, permitindo que as classes derivadas adicionem os recursos ausentes. ADataView
classe é um exemplo para umaIBindingList
implementação completa ; no entanto, não é para coleções digitadas em primeiro lugar. E aBindingSource
classe no WinForms é um exemplo híbrido: suporta classificação se envolver outraIBindingList
implementação, que suporta classificação.ObservableCollection<T>
já é uma implementação completa daINotifyCollectionChanged
interface (que possui apenas um único evento). Ele também possui membros virtuais, masObservableCollection<T>
normalmente é derivado pelo mesmo motivo que suaCollection<T>
classe base : para personalizar adicionar / remover itens (por exemplo, em uma coleção de modelos de dados) em vez de ajustar os recursos de ligação.Cópia x quebra automática
Ambos
ObservableCollection<T>
eBindingList<T>
têm 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 invólucro observável para a lista fornecida e as alterações executadas noBindingList<T>
serão refletidas na coleção subjacente.ObservableCollection<T>
por outro lado, passa uma novaList<T>
instância para oCollection<T>
construtor base e copia os elementos da coleção original para essa nova lista. Obviamente, seT
for um tipo de referência, as alterações nos elementos serão visíveis na coleção original, mas a coleção em si não será atualizada.fonte
Mais uma grande diferença entre
ObservableCollection
eBindingList
isso é útil e pode ser um fator de decisão de lance no tópico:BindingList
Manipulador de alterações de lista:ObservableCollection
Alteração de coleção:As conclusões acima são
INotifyPropertyChanged
implementadas em classes de modelo. Por padrão, nenhum gera o evento alterado se uma propriedade for alterada em um item.fonte