リストをリストボックスのデータソースにバインドできるようにしたいのですが、リストが変更されるとリストボックスのUIが自動的に更新されます。 (ASPではなくWinforms)。ここ はサンプルです: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_;
}
}
私はBindingList<Foo> fooList = new BindingList<Foo>();
でList<Foo> fooList = new List<Foo>();
を交換する場合、それは動作します。しかし、私は愚か者の元のタイプを変更したくありません。 「あなたがリスト<へのBindingSourceのDataSourceを設定すると、それは内部的にあなたのリストをラップするするBindingListを作成します>」:listBox1.DataSource = new BindingList<Foo>(fooList);
EDIT:また、私はちょうどここList<T> vs BindingList<T> Advantages/DisAdvantagesイリヤJerebtsovから読んで私は仕事にこのような何かをしたいと思います。私のサンプルは、これが真実ではないことを実証していると思います。私のリスト<>はBindingList <に内部的にラップされていないようです。
リスト<>は、オブザーバーがいつ更新するかを知るためのイベントを生成しません。オブザーバがUIコンポーネントであるか、ラッパーとして動作する別のリストであるかは関係ありません。バインド時にバインディングリストに変更することに異論があるのはなぜですか? – JRoughan
ListをBindingListに変更したくないのは、既にプロジェクトのどこでもリストとして使用されているからです。私はすべてのメソッドのシグネチャを置き換える必要があります、私はすでに安定しているものを変更することを避けたいです。 – Michael
戻り値の型をIListに変更した場合はどうなりますか?あなたはまだ変化の同じ量を持っていますか? –
JRoughan