Chcę móc powiązać listę ze źródłem danych listbox, a kiedy lista zostanie zmodyfikowana, interfejs listy listbox zostanie automatycznie zaktualizowany. (Winformy nie ASP). Oto przykład:Lista powiązań do źródła danych
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_;
}
}
Gdybym zastąpić List<Foo> fooList = new List<Foo>();
przez BindingList<Foo> fooList = new BindingList<Foo>();
to działa. Ale nie chcę zmieniać oryginalnego typu foolist. Chciałbym coś takiego pracy: listBox1.DataSource = new BindingList<Foo>(fooList);
EDIT: Również Właśnie przeczytałem tutaj List<T> vs BindingList<T> Advantages/DisAdvantages z Ilia Jerebtsov: „Po ustawieniu DataSource BindingSource użytkownika do listy <>, to wewnętrznie tworzy BindingList zawijać liście”. Myślę, że moja próbka demonstruje, że to nie jest prawda: moja lista <> nie jest wewnętrznie zapakowana w BindingList <>.
Lista <> nie powoduje żadnych zdarzeń dla obserwatorów, aby wiedzieć, kiedy dokonać aktualizacji. Nie ma znaczenia, czy obserwator jest składnikiem interfejsu użytkownika, czy inną listą działającą jako opakowanie. Dlaczego sprzeciw wobec zmiany na Listę wiążącą podczas wiązania jest tym, co musisz zrobić? – JRoughan
Nie chcę zmieniać listy na BindingList, ponieważ jest już używana jako lista wszędzie w projekcie. Będę musiał wymienić wszystkie podpisy metod, chcę uniknąć modyfikowania tego, co jest już stabilne. – Michael
Co się stanie, jeśli zmienisz typ zwrotu na IList? Czy nadal masz taką samą ilość przełomowych zmian? –
JRoughan