Нужна ли мне BindingSource и привязый список для DataBinding Winforms?
-
10-10-2019 - |
Вопрос
Я хочу показать список людей в DataGridView
в приложении Windows Forms. Я хочу, чтобы мой уровень обслуживания вернул список объектов человека (например, 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>
."
Решение
Если вы используете BindingList<T>
Затем изменения, которые вы вносите через базовый список, будут отражены в элементах управления Data Bound, поскольку BindingList повышает событие при изменении списка. Большинство других коллекций нет.
Если вы используете нормальную коллекцию в качестве источника данных, то изменения, которые вы вносите через другие элементы управления, связанных с данными (или через BindingSource), все еще будут отражены, но изменения в базовой сборе непосредственно не будут.
Другие советы
Связывание с IList<Person>
даст вам только одностороннее привязку; Изменения в списке или элементах списка не будут отражены в DataGridView
. Анкет Вы можете использовать BindingList
или же BindingSource
вместо этого получить эту функциональность, но ваш Person
Классу все еще нужно поддержать INotifyPropertyChanged
Или иначе вы получите синхронизацию только при добавлении/удалении элементов в/из списка, а не при изменении сами элементов списка.
Если вы хотите избежать зависимости от System.Windows.Forms
, вы можете использовать ObservableCollection<Person>
вместо; Это поддерживает необходимые уведомления об изменениях и поэтому может использоваться в качестве двустороннего источника связывания.