加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 将列表绑定到DataSource

发布时间:2020-12-15 08:09:43 所属栏目:百科 来源:网络整理
导读:我希望能够将列表绑定到列表框数据源,并且在修改列表时,列表框的UI会自动更新. ( Winforms不是ASP). 这是一个示例: private ListFoo fooList = new ListFoo(); private void Form1_Load(object sender,EventArgs e) { //Add first Foo in fooList Foo foo1
我希望能够将列表绑定到列表框数据源,并且在修改列表时,列表框的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一起使用

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读