Перелік <T> проти BindingList <T> Переваги / Недоліки


91

Хтось може описати, яка різниця між ними є для мого проекту.

В даний час я маю List<MyClass>і встановлюю BindingSource для цього, а DataGridView - для BindingSource.

Я реалізував, IEditableObjectтому, коли викликається CancelEdit, я повертаю свій об'єкт назад до того, що він був за допомогоюMemberwise.Clone()

Чи вирішить щось із цього зміна мого Списку на BindingList і які переваги використання BindingList?

Відповіді:


123

A List<>- це просто масив із автоматичним зміною розміру елементів даного типу з кількома допоміжними функціями (наприклад: сортування). Це лише дані, і ви, швидше за все, будете використовувати їх для запуску операцій з набором об’єктів у вашій моделі.

A BindingList<>- це обгортка навколо набраного списку або колекції, яка реалізує IBindingListінтерфейс. Це один із стандартних інтерфейсів, що підтримує двосторонню прив'язку даних. Це працює шляхом реалізації ListChangedподії, яка виникає під час додавання, видалення чи встановлення елементів. Зв’язані елементи керування слухають цю подію, щоб знати, коли слід оновити їх показ.

Коли ви встановлюєте для джерела даних BindingSource значення a List<>, він внутрішньо створює a BindingList<>для обгортання вашого списку. Можливо, ви захочете попередньо обернути свій список BindingList<>собою, якщо хочете отримати доступ до нього за межами BindingSource, але в іншому випадку це точно так само. Ви також можете успадкувати від, BindingList<>щоб реалізувати особливу поведінку при зміні елементів.

IEditableObjectобробляється BindingSource. Він буде викликати BeginEdit для будь-якого реалізуючого об'єкта, коли ви зміните дані в будь-якому зв'язаному елементі управління. Потім ви можете викликати EndEdit / CancelEdit на BindingSource, і він передасть його вашому об’єкту. Перехід до іншого рядка також викликає EndEdit.


В даний час із моїм підходом List <T>, який викликає CancelEdit, не повертається елемент, що редагується, у початковий стан, отже, чому я використовую Clone (). Ви хочете сказати, що це зробить для мене список прив’язок?
Джон

3
Ні, BindingList не має нічого спільного з цією функціональністю. BindingSource просто викликає CancelEdit для поточного об'єкта незалежно від типу базового списку. У фреймворку немає нічого, що автоматично реалізує версію об’єктів для простих об’єктів. Ви можете використовувати DataTables / DataRows, які зберігають оригінальну копію даних саме для цієї мети.
Alex J

Ви кажете, що органи управління повинні знати, коли список змінюється, чи можете ви пояснити далі? У мене є форма з datagridview, а потім інша форма із такою із заповненими даними. Чи потрібно мені турбуватися про те, що ви говорите з цього приводу?
Джон

Наприклад, DataGrid повинен знати, коли елементи додаються до вашого списку, щоб додати новий рядок. Для цього він використовує подію ListChanged BindingList. Якби ви прив'язували сітку безпосередньо до List <T>, у вас не було б події, і сітка не змогла б знати, коли ви змінили список. Вам не потрібно турбуватися про це у своєму сценарії, оскільки BindingSource обгортає List <T> у BindingList для вас. Поки ви працюєте з BindingSource, а не із самим списком, елементи керування залишатимуться синхронізованими.
Alex J,

Чи є якийсь обхідний спосіб використання BindingList для інтерфейсу WPF (спосіб mvvm)? Чи можу я обернути список прив'язок до спостережуваної колекції?
Lance

12

BindingList дозволяє двостороннє прив'язку даних за допомогою подій, Список не запускає події, коли його колекція змінюється.

Я не думаю, що це вирішить вашу конкретну проблему.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.