Список <T> против BindingList <T> Преимущества / недостатки

93

Может ли кто-нибудь описать, в чем разница между ними для моего проекта.

В настоящее время у меня есть List<MyClass>и установлен BindingSource для этого и DataGridView для BindingSource.

Я реализовал IEditableObjectтак, что при вызове CancelEdit я возвращаю свой объект обратно к тому, что было с помощьюMemberwise.Clone()

Решит ли изменение моего списка на BindingList что-либо из этого и каковы преимущества использования BindingList?

Джон
источник

Ответы:

124

A List<>- это просто автоматически изменяющийся массив элементов данного типа с парой вспомогательных функций (например, sort). Это просто данные, и вы, вероятно, будете использовать их для выполнения операций с набором объектов в вашей модели.

A BindingList<>- это оболочка для типизированного списка или коллекции, которая реализует IBindingListинтерфейс. Это один из стандартных интерфейсов, поддерживающих двустороннюю привязку данных. Он работает путем реализации ListChangedсобытия, которое возникает при добавлении, удалении или установке элементов. Связанные элементы управления прослушивают это событие, чтобы знать, когда обновить их отображение.

Когда вы устанавливаете DataSource 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
13

BindingList допускает двустороннюю привязку данных с помощью событий, список не запускает события при изменении его коллекции.

Я не думаю, что это решит вашу конкретную проблему.

Герри Шенк
источник