c# – 将列表绑定到DataSource
我希望能够将列表绑定到列表框数据源,并且在修改列表时,列表框的UI会自动更新. (
Winforms不是ASP).
这是一个示例: 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); 编辑:我还在这里阅读来自Ilia Jerebtsov的List<T> vs BindingList<T> Advantages/DisAdvantages:“当你将BindingSource的DataSource设置为List<>时,它会在内部创建一个BindingList来包装你的列表”.我想我的样本只是证明了这不是真的:我的列表<>似乎没有内部包装到BindingList<>中. 解决方法
你的例子中没有
BindingSource.
您需要像这样修改它以使用BindingSource var bs = new BindingSource(); Foo foo1 = new Foo("bar1"); fooList.Add(foo1); bs.DataSource = fooList; //<-- point of interrest //Bind fooList to the listBox listBox1.DataSource = bs; //<-- notes it takes the entire bindingSource 编辑 请注意(正如评论中指出的那样) – bindingsource不能与INotifyPropertyChanged一起使用 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |