Desidero essere in grado di associare un elenco a un'origine dati casella di riepilogo e quando l'elenco viene modificato, l'interfaccia utente della casella di riepilogo viene aggiornata automaticamente. (Winforms non ASP). Ecco un esempio:Bind List a 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_;
}
}
Se sostituisco List<Foo> fooList = new List<Foo>();
da BindingList<Foo> fooList = new BindingList<Foo>();
allora funziona. Ma non voglio cambiare il tipo originale di follista. Vorrei qualcosa di simile al lavoro: listBox1.DataSource = new BindingList<Foo>(fooList);
EDIT: Inoltre ho appena letto qui List<T> vs BindingList<T> Advantages/DisAdvantages da Ilia Jerebtsov: "Quando si imposta DataSource del BindingSource a un elenco <>, si crea internamente un BindingList per avvolgere la lista". Penso che il mio esempio dimostri solo che questo non è vero: la mia lista <> non sembra essere internamente racchiusa in un BindingList <>.
Elenco <> non genera eventi per gli osservatori per sapere quando eseguire l'aggiornamento. Non importa se l'osservatore è un componente dell'interfaccia utente o un altro elenco che funge da wrapper. Perché l'obiezione a cambiare a BindingList quando è vincolante è ciò che devi fare? – JRoughan
Non desidero modificare l'elenco in BindingList perché è già utilizzato come elenco ovunque nel progetto. Dovrò sostituire ogni firma di metodo, voglio evitare di modificare ciò che è già stabile. – Michael
Cosa succede se hai cambiato il tipo di ritorno in IList? Hai ancora la stessa quantità di cambi di rottura? –
JRoughan