Нужен ли мне 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>
; это поддерживает необходимые уведомления об изменениях и поэтому может использоваться как источник двусторонней привязки.