2016-09-18 1 views
2

У меня есть:Как сделать BindingSource осведомленным об изменениях в своем DataSource?

someBindingSource.DataSource = someDataSource; 

И я также делаю:

someDataSource = foo(); 

foo() делает new для другого источника данных с различными данными.

Я не думаю, что это правильно выполнить задание каждый раз, когда изменяется источник данных, то есть:

someDataSource = foo(); 
someBindingSource.DataSource = someDataSource; 

так есть способ сделать someBindingSource известно об изменении в someDataSource?

+0

Вы не вносите изменения в someDataSource, но заменяете весь объект. Поэтому я не думаю, что это будет возможно без обертывания someDataSource контейнером и изменения данных с помощью некоторого метода контейнера (посмотрите на ObservableCollection ) – barakcaf

+0

Я возьму ObservableCollection с одним элементом? – shinzou

+0

Думаю, дело в том, что вы должны обернуть свой объект dataSource и заменить данные с помощью какого-либо метода, если вы хотите заменить источник данных (вместо его обновления) и все еще иметь уведомление о связывании – barakcaf

ответ

2

Если источник данных реализует значение IBindingList inteface, то BindingSource будет проинформирован о добавлении или удалении элементов в источник данных. Хорошая реализация для использования - BindingList<T>.

Также, если элементы источника данных реализуют INotifyPropertyChanged, тогда BindingSource также будет уведомлен об изменениях в элементах.

В вышеуказанных случаях ListChanged событие будет поднято.

Примечание

  1. Обратите внимание, если вы назначаете someBindingSource.DataSource = someThing; и затем someThing = new SomeThing();, поскольку someBindingSource.DataSource указывает на предыдущий объект, не существует никаких изменений и не будет никаких уведомлений.
  2. DataSourceChanged событие будет поднят после того, как вы присвоить новое значение DataSource в виде BindingSource, поэтому после someThing = new SomeThing(); в предыдущей ситуации, если выполнить someBindingSource.DataSource = someThing; то DataSourceChanged будет поднят.