Нужен ли мне BindingSource и BindingList для привязки данных WinForms?

Я хочу отобразить список людей в DataGridView в приложении Windows Forms. Я хочу, чтобы мой уровень обслуживания возвращал список объектов Person (например,IList<Person>). Я хочу, чтобы изменения в списке отражались в DataGridView и наоборот. Я понимаю, что использование BindingSource облегчает работу с DataGridView. Мой вопрос заключается в том, чтобы двусторонняя привязка данных работала, мне нужно:

//pseudo code
BindingSource.DataSource = IBindingList<Person>

или я могу сделать:

BindingSource.DataSource = IList<Person>

какая разница? Если мои изменения в список будет DataGridView обновляться в любом случае? И если мне придется использовать BindingList, кажется немного шатким (из-за создания зависимости), чтобы вернуть BindingList из моего уровня обслуживания, есть ли способ обойти это?

Microsoft говорит о BindingList (в разделе "Примечания" ) http://msdn.microsoft.com/en-us/library/ms132679.aspx:

"однако, типовые решения программист будет использовать класс, который обеспечивает привязку данных функциональность, такие как BindingSource, вместо непосредственно с помощью BindingList<T>."

2 ответов


Если вы используете BindingList<T> затем изменения, внесенные через базовый список, будут отражены в элементах управления привязкой данных, поскольку BindingList вызывает событие при изменении списка. Большинство других коллекций-нет.

Если вы используете обычную коллекцию в качестве источника данных, то изменения, внесенные с помощью других связанных с данными элементов управления (или через BindingSource), будут по-прежнему отражаться, но изменения базовой коллекции напрямую не будут.


привязка к IList<Person> даст вам только одностороннюю привязку; изменения в списке или элементах списка не будут отражены в DataGridView. Вы можете использовать BindingList или BindingSource чтобы получить эту функциональность вместо этого, но ваш Person класс по-прежнему должен поддерживать INotifyPropertyChanged или вы получите синхронизацию только при добавлении/удалении элементов в / из списка, а не при изменении самих элементов списка.

если вы хотите избежать зависимости от System.Windows.Forms, вы могли бы использовать ObservableCollection<Person> вместо этого; это поддерживает необходимые уведомления об изменениях и поэтому может использоваться как двусторонний источник привязки.