Нужен ли BindingSource И BindingList для привязки данных WinForms? - PullRequest
11 голосов
/ 13 января 2011

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

11 голосов
/ 13 января 2011

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

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

3 голосов
/ 13 января 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...