Daftar <T> vs BindingList <T> Keuntungan / Kerugian

93

Adakah yang bisa menjelaskan apa perbedaan antara keduanya untuk proyek saya.

Saat ini saya memiliki List<MyClass>dan mengatur BindingSource untuk itu dan DataGridView ke BindingSource.

Saya telah mengimplementasikan IEditableObjectsehingga ketika CancelEdit dipanggil saya mengembalikan objek saya kembali ke apa sebelumnya dengan aMemberwise.Clone()

Akankah mengubah Daftar saya menjadi BindingList menyelesaikan semua ini dan apa keuntungan menggunakan BindingList?

Jon
sumber

Jawaban:

124

A List<>hanyalah larik yang mengubah ukuran secara otomatis, dari item dengan tipe tertentu, dengan beberapa fungsi pembantu (misalnya: sort). Ini hanya datanya, dan Anda cenderung menggunakannya untuk menjalankan operasi pada sekumpulan objek dalam model Anda.

A BindingList<>adalah pembungkus di sekitar daftar atau koleksi yang diketik, yang mengimplementasikan IBindingListantarmuka. Ini adalah salah satu antarmuka standar yang mendukung penyatuan data dua arah. Ia bekerja dengan mengimplementasikan ListChangedacara, yang dimunculkan saat Anda menambahkan, menghapus, atau menyetel item. Kontrol terikat mendengarkan acara ini untuk mengetahui kapan harus menyegarkan tampilan mereka.

Saat Anda menyetel DataSource BindingSource ke a List<>, itu secara internal membuat BindingList<>untuk membungkus daftar Anda. Anda mungkin ingin membungkus daftar Anda dengan BindingList<>diri Anda sendiri jika Anda ingin mengaksesnya di luar BindingSource, tetapi sebaliknya itu sama saja. Anda juga dapat mewarisi dari BindingList<>untuk menerapkan perilaku khusus saat mengubah item.

IEditableObjectditangani oleh BindingSource. Ini akan memanggil BeginEdit pada objek implementasi apa pun saat Anda mengubah data dalam kontrol terikat apa pun. Anda kemudian dapat memanggil EndEdit / CancelEdit di BindingSource dan itu akan meneruskannya ke objek Anda. Pindah ke baris lain akan memanggil EndEdit juga.

Alex J.
sumber
Saat ini dengan pendekatan Daftar <T> saya memanggil CancelEdit tidak akan mengembalikan item yang sedang diedit kembali ke keadaan semula oleh karena itu mengapa saya menggunakan Clone (). Apakah Anda mengatakan bahwa bindinglist akan menanganinya untuk saya?
Jon
3
Tidak, BindingList tidak ada hubungannya dengan fungsionalitas itu. BindingSource hanya memanggil CancelEdit pada objek saat ini terlepas dari jenis daftar yang mendasarinya. Tidak ada dalam kerangka kerja yang secara otomatis mengimplementasikan pembuatan versi objek untuk objek biasa. Anda dapat menggunakan DataTables / DataRows, yang menyimpan salinan asli data hanya untuk tujuan ini.
Alex J
Anda mengatakan bahwa kontrol perlu mengetahui saat daftar berubah, dapatkah Anda menjelaskan lebih lanjut? Saya memiliki formulir dengan datagridview dan kemudian formulir lain dari itu dengan data terpopulasi. Apakah saya perlu mengkhawatirkan diri saya sendiri tentang apa yang Anda katakan dalam hal ini?
Jon
Misalnya, DataGrid perlu mengetahui kapan item ditambahkan ke daftar Anda untuk menambahkan baris baru. Untuk itu menggunakan event ListChanged dari BindingList. Jika Anda mengikat kisi secara langsung ke Daftar <T>, Anda tidak akan memiliki acara tersebut, dan kisi tidak akan dapat mengetahui saat Anda mengubah daftar. Anda tidak perlu mengkhawatirkannya dalam skenario Anda karena BindingSource membungkus List <T> dalam BindingList untuk Anda. Selama Anda bekerja dengan BindingSource dan bukan daftar itu sendiri, kontrol akan tetap sinkron.
Alex J
Apakah ada solusi untuk menggunakan BindingList ke WPF UI (cara mvvm)? Dapatkah saya menggabungkan bindinglist menjadi koleksi yang dapat diamati?
Lance
13

BindingList memungkinkan penyatuan data dua arah dengan menggunakan peristiwa, Daftar tidak mengaktifkan peristiwa saat koleksinya berubah.

Saya tidak berpikir itu akan memperbaiki masalah khusus Anda.

Gerrie Schenck
sumber