Есть listbox и самодельная коллекция элементов, цепляю ее как DataSourse к listbox. Что надо сделать, чтобы программно добавляемые элементы отображались в listbox? Если судить по аналогии с простым биндингом, то в классе надо было реализовать событие PropertyChanged, возможно здесь тоже необходимо событие. Пробовал добавлять для коллекции события ListChanged (взято было из BindingSourse) CollectionChanged (взято из listbox). Пока чего-то больше не придумывается вариантов. Подкиньте идею.
BindingSource sourse = new BindingSource();
sourse.DataSource = prData;
sourse.DataMember = string.Empty;
list.DataSource = sourse;
list.DisplayMember = "Name";
01.03.07 08:20: Перенесено модератором из '.NET' — Хитрик Денис
кажеться коллекция должна реализовывать IBindingList или чтото в этом роде. точно не помню
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Здравствуйте, cvetkov, Вы писали:
C>кажеться коллекция должна реализовывать IBindingList или чтото в этом роде. точно не помню
Всё верно. Если ваша коллекция предназначена только для биндинга, то можно не создавать свой класс коллекции, а воспользоваться BindingList<T>. Вот пример для ComboBox'а :
private class AddressToken : INotifyPropertyChanged, IDisposable
{
...
}
...
private BindingList<AddressToken> _addressTokens;
...
cmbAddress.BeginUpdate();
cmbAddress.Items.Clear();
_addressTokens = new BindingList<AddressToken>();
_addressTokens.AllowEdit = false;
_addressTokens.AllowNew = false;
_addressTokens.AllowRemove = false;
foreach (DataRowView rowView in AddressBindingSource)
{
_addressTokens.Add(new AddressToken(rowView.Row));
}
cmbAddress.DataSource = new BindingSource(_addressTokens, string.Empty);
cmbAddress.DisplayMember = "Address";
cmbAddress.ValueMember = "Id";
UpdateSelectedAddress();
cmbAddress.EndUpdate();
Все действия с коллекцией _addressTokens сразу же будут отражаться в ComboBox'е. Если элемент коллекции правильно реализует INotifyPropertyChanged, то будут автоматически отображаться изменения в значении отображаемого свойства (в данном примере — Address).