ObservableCollection
Mogą być aktualizowane z UI dokładnie tak jak każdej kolekcji. Prawdziwa różnica jest raczej prosta:
ObservableCollection<T>
implementuje, INotifyCollectionChanged
który zapewnia powiadomienie o zmianie kolekcji (zgadłeś ^^) Pozwala silnikowi powiązań na aktualizację interfejsu użytkownika po ObservableCollection
aktualizacji.
Jednak BindingList<T>
implementuje IBindingList
.
IBindingList
zapewnia powiadomienia o zmianach w kolekcji, ale nie tylko. Zapewnia całą gamę funkcji, które mogą być używane przez interfejs użytkownika w celu dostarczenia znacznie więcej rzeczy niż tylko aktualizacje interfejsu użytkownika zgodnie ze zmianami, takie jak:
- Sortowanie
- Badawczy
- Dodaj przez fabrykę (funkcja dodawania nowego członka).
- Lista tylko do odczytu (właściwość CanEdit)
Wszystkie te funkcje nie są dostępne w ObservableCollection<T>
Kolejną różnicą jest to, że BindingList
przekazuje powiadomienia o zmianie elementu, gdy jego elementy zostaną zaimplementowane INotifyPropertyChanged
. Jeśli przedmiot wywołuje PropertyChanged
zdarzenie, BindingList
otrzyma go podbija za ListChangedEvent
pomocą ListChangedType.ItemChanged
i OldIndex=NewIndex
(jeśli przedmiot został wymieniony, OldIndex=-1
). ObservableCollection
nie przekazuje powiadomień o przedmiotach.
Pamiętaj, że w Silverlight BindingList
nie jest dostępna jako opcja: możesz jednak użyć ObservableCollection
s i ICollectionView
(i IPagedCollectionView
jeśli dobrze pamiętam).
BindingList
przestarzały?Praktyczną różnicą jest to, że BindingList jest dla WinForms, a ObservableCollection jest dla WPF.
Z perspektywy WPF BindingList nie jest odpowiednio obsługiwany i nigdy tak naprawdę nie użyłbyś go w projekcie WPF, chyba że naprawdę musiałbyś.
źródło
Najważniejsze różnice, takie jak funkcje i powiadomienia o zmianach w zawartych elementach, są już wspomniane w zaakceptowanej odpowiedzi, ale jest ich więcej, o których również warto wspomnieć:
Występ
Po
AddNew
wywołaniuBindingList<T>
wyszukuje dodany element przezIndexOf
wyszukiwanie. A jeśliT
implementuje,INotifyPropertyChanged
indeks zmienionego elementu jest również przeszukiwany przezIndexOf
(chociaż nie ma nowego wyszukiwania, o ile ten sam element zmienia się wielokrotnie). Jeśli przechowujesz tysiące elementów w kolekcji, wtedyObservableCollection<T>
(lub niestandardowaIBindingList
implementacja z kosztem wyszukiwania O (1)) może być bardziej preferowana.Kompletność
IBindingList
Interfejs jest ogromny jeden (może nie najczystsze konstrukcja) i pozwala implementors wdrożyć tylko podzbiór jego cech. Na przykładAllowNew
,SupportsSorting
iSupportsSearching
właściwości powiedzieć, czyAddNew
,ApplySort
iFind
metody mogą być stosowane odpowiednio. Często zaskakuje ludzi, którzyBindingList<T>
sami nie obsługują sortowania. W rzeczywistości zapewnia pewne wirtualne metody pozwalające klasom pochodnym dodać brakujące funkcje.DataView
Klasa jest przykładem dla pełnegoIBindingList
wdrożenia; nie dotyczy to jednak przede wszystkim kolekcji maszynowych. ABindingSource
klasa w WinForm jest przykładem hybrydowym: obsługuje sortowanie, jeśli otacza innąIBindingList
implementację, która obsługuje sortowanie.ObservableCollection<T>
jest już pełną implementacjąINotifyCollectionChanged
interfejsu (który ma tylko jedno zdarzenie). Ma także wirtualne elementy, aleObservableCollection<T>
zazwyczaj pochodzi z tego samego powodu, co jego podstawowaCollection<T>
klasa: do dostosowywania dodawania / usuwania elementów (np. W kolekcji modelu danych) zamiast dostosowywania funkcji wiązania.Kopiowanie a zawijanie
Zarówno
ObservableCollection<T>
iBindingList<T>
mieć konstruktora, który akceptuje już istniejącej listy. Chociaż zachowują się inaczej, gdy są tworzone przez inną kolekcję:BindingList<T>
działa jako obserwowalne opakowanie dla podanej listy, a zmiany dokonane naBindingList<T>
zostaną odzwierciedlone również w podstawowej kolekcji.ObservableCollection<T>
z drugiej strony przekazuje nowąList<T>
instancję doCollection<T>
konstruktora podstawowego i kopiuje elementy oryginalnej kolekcji na nową listę. Oczywiście, jeśliT
jest to typ odniesienia, zmiany w elementach będą widoczne z oryginalnej kolekcji, ale sama kolekcja nie zostanie zaktualizowana.źródło
Jeszcze jedna wielka różnica między tym
ObservableCollection
aBindingList
tym, co jest przydatne, i może być czynnikiem decydującym o stawce na ten temat:BindingList
Moduł zmiany listy:ObservableCollection
Zmiana kolekcji:Powyższe wnioski dotyczą
INotifyPropertyChanged
implementacji w klasach modeli. Domyślnie żaden nie wywołuje zmienionego zdarzenia, jeśli właściwość jest zmieniana w elemencie.źródło