Я хочу, чтобы иметь возможность привязывать список к источнику данных listbox и когда список изменен, пользовательский интерфейс списка автоматически обновляется. (Winforms не ASP). Вот пример:Bind List to DataSource
private List<Foo> fooList = new List<Foo>();
private void Form1_Load(object sender, EventArgs e)
{
//Add first Foo in fooList
Foo foo1 = new Foo("bar1");
fooList.Add(foo1);
//Bind fooList to the listBox
listBox1.DataSource = fooList;
//I can see bar1 in the listbox as expected
}
private void button1_Click(object sender, EventArgs e)
{
//Add anthoter Foo in fooList
Foo foo2 = new Foo("bar2");
fooList.Add(foo2);
//I expect the listBox UI to be updated thanks to INotifyPropertyChanged, but it's not
}
class Foo : INotifyPropertyChanged
{
private string bar_ ;
public string Bar
{
get { return bar_; }
set
{
bar_ = value;
NotifyPropertyChanged("Bar");
}
}
public Foo(string bar)
{
this.Bar = bar;
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
public override string ToString()
{
return bar_;
}
}
Если я заменяю List<Foo> fooList = new List<Foo>();
на BindingList<Foo> fooList = new BindingList<Foo>();
то он работает. Но я не хочу менять оригинальный тип глупого. Я хотел бы что-то вроде этого, чтобы работать: listBox1.DataSource = new BindingList<Foo>(fooList);
EDIT: Кроме того, я только что прочитал здесь List<T> vs BindingList<T> Advantages/DisAdvantages с Ильей Жеребцов: «Когда вы установите DataSource BindingSource к Перечню <>, он внутренне создает BindingList, чтобы обернуть список». Я думаю, что мой пример просто показывает, что это не так: мой список <>, кажется, не внутренне завернут в BindingList <>.
Список <> не создает никаких событий для наблюдателей, которые знают, когда их нужно обновлять. Не имеет значения, является ли наблюдатель компонентом пользовательского интерфейса или другим списком, действующим в качестве обертки. Почему возражение о переходе на BindingList при привязке - это то, что вам нужно сделать? – JRoughan
Я не хочу изменять список в BindingList, потому что он уже используется в качестве списка везде в проекте. Мне придется заменить все подписи методов, я хочу избежать изменения того, что уже стабильно. – Michael
Что делать, если вы изменили тип возврата на IList? У вас все еще есть такое же количество нарушений? –
JRoughan