Sebuah ObservableCollection
dapat diperbarui dari UI persis seperti koleksi apa pun. Perbedaan yang sebenarnya agak langsung:
ObservableCollection<T>
mengimplementasikan INotifyCollectionChanged
yang memberikan notifikasi ketika koleksi diubah (Anda tebak ^^) Ini memungkinkan mesin pengikat untuk memperbarui UI saat ObservableCollection
diperbarui.
Namun, BindingList<T>
implementasinya IBindingList
.
IBindingList
memberikan pemberitahuan tentang perubahan koleksi, tetapi tidak hanya itu. Ini menyediakan sejumlah fungsionalitas yang dapat digunakan oleh UI untuk menyediakan lebih banyak hal daripada hanya pembaruan UI menurut perubahan, seperti:
- Penyortiran
- Mencari
- Tambah melalui pabrik (fungsi anggota AddNew).
- Daftar hanya baca (properti CanEdit)
Semua fungsi ini tidak tersedia di ObservableCollection<T>
Perbedaan lainnya adalah BindingList
relay pemberitahuan perubahan item saat item diterapkan INotifyPropertyChanged
. Jika suatu item memunculkan suatu PropertyChanged
event, maka BindingList
akan menerimanya sebuah menimbulkan ListChangedEvent
dengan ListChangedType.ItemChanged
dan OldIndex=NewIndex
(jika suatu item diganti, OldIndex=-1
). ObservableCollection
tidak menyampaikan pemberitahuan item.
Perhatikan bahwa di Silverlight, BindingList
tidak tersedia sebagai opsi: Namun Anda dapat menggunakan ObservableCollection
s dan ICollectionView
(dan IPagedCollectionView
jika saya ingat dengan baik).
BindingList
sudah usang?Perbedaan praktisnya adalah bahwa BindingList adalah untuk WinForms, dan ObservableCollection adalah untuk WPF.
Dari perspektif WPF, BindingList tidak didukung dengan benar, dan Anda tidak akan pernah benar-benar menggunakannya dalam proyek WPF kecuali Anda benar-benar harus melakukannya.
sumber
Perbedaan paling penting seperti fitur dan pemberitahuan perubahan tentang elemen yang terkandung sudah disebutkan oleh jawaban yang diterima tetapi ada lebih banyak, yang juga layak disebutkan:
Performa
Ketika
AddNew
dipanggil,BindingList<T>
mencari item yang ditambahkan denganIndexOf
pencarian. Dan jikaT
mengimplementasikanINotifyPropertyChanged
indeks elemen yang diubah juga dicari olehIndexOf
(meskipun tidak ada pencarian baru selama item yang sama berubah berulang kali). Jika Anda menyimpan ribuan elemen dalam koleksi, makaObservableCollection<T>
(atauIBindingList
implementasi kustom dengan O (1) biaya pencarian) bisa lebih disukai.Kelengkapan
The
IBindingList
antarmuka adalah satu besar (mungkin bukan desain terbersih) dan memungkinkan pelaksana untuk melaksanakan hanya sebagian dari fitur-fiturnya. Sebagai contoh,AllowNew
,SupportsSorting
danSupportsSearching
sifat tahu apakahAddNew
,ApplySort
danFind
metode dapat digunakan, masing-masing. Ini sering mengejutkan orang-orang yangBindingList<T>
tidak mendukung penyortiran. Sebenarnya ia menyediakan beberapa metode virtual membiarkan kelas turunan menambahkan fitur yang hilang. TheDataView
kelas adalah contoh untuk penuhIBindingList
implementasi; Namun, itu bukan untuk koleksi yang diketik di tempat pertama. DanBindingSource
kelas di WinForms adalah contoh hibrid: ia mendukung pengurutan jika membungkusIBindingList
implementasi lain , yang mendukung pengurutan.ObservableCollection<T>
sudah merupakan implementasiINotifyCollectionChanged
antarmuka yang lengkap (yang hanya memiliki satu acara). Ini juga memiliki anggota virtual tetapiObservableCollection<T>
biasanya diturunkan untuk alasan yang sama denganCollection<T>
kelas dasarnya : untuk menyesuaikan menambahkan / menghapus item (misalnya dalam koleksi model data) daripada menyesuaikan fitur yang mengikat.Salin vs. pembungkus
Keduanya
ObservableCollection<T>
danBindingList<T>
memiliki konstruktor, yang menerima daftar yang sudah ada. Meskipun mereka berperilaku berbeda ketika mereka dipakai oleh koleksi lain:BindingList<T>
bertindak sebagai pembungkus yang dapat diamati untuk daftar yang disediakan, dan perubahan yang dilakukan padaBindingList<T>
akan tercermin pada koleksi yang mendasarinya juga.ObservableCollection<T>
di sisi lain meneruskanList<T>
contoh baru keCollection<T>
konstruktor dasar dan menyalin elemen koleksi asli ke daftar baru ini. Tentu saja, jikaT
perubahan tipe referensi pada elemen akan terlihat dari koleksi asli tetapi koleksi itu sendiri tidak akan diperbarui.sumber
Satu lagi Perbedaan besar antara
ObservableCollection
danBindingList
yang berguna, dan dapat menjadi faktor keputusan tawaran pada topik:BindingList
Daftar Handler Perubahan:ObservableCollection
Perubahan koleksi:Kesimpulan di atas dalam hal
INotifyPropertyChanged
diimplementasikan dalam kelas model. Secara default tidak ada yang memunculkan acara yang diubah jika properti diubah dalam suatu item.sumber