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