Нужен ли мне BindingSource и BindingList для WinForms DataBinding?

Я хочу отобразить список людей в 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>."

Ответ 1

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

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

Ответ 2

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

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