试图在WinForms c#</t>中将List <t>绑定到CheckedListBox

时间:2011-08-03 19:34:17

标签: c# winforms visual-studio-2010 data-binding

我正在使用WinForms C# 有没有办法获得以下行为:

  1. 将List绑定到CheckedListBox
  2. 当我向列表中添加元素时,CheckedList框参考
  3. 当我更改CheckedListBox时,列表会更改
  4. 我尝试执行以下操作:

    构造函数代码:

    checkedlistBox1.DataSource = a;
    checkedlistBox1.DisplayMember = "Name";
    checkedlistBox1.ValueMember = "Name";
    

    字段:

    List<Binder> a = new List<Binder> { new Binder { Name = "A" } };

    在按钮1上单击:

    private void butto1_Click(object sender, EventArgs e)
    {
        a.Add(new Binder{Name = "B"});
        checkedListBox1.Invalidate();
        checkedListBox1.Update();
    }
    

    但视图不会更新。

    谢谢。

4 个答案:

答案 0 :(得分:7)

更改此行:

List<Binder> a = new List<Binder> { new Binder { Name = "A" } };

到此:

BindingList<Binder> a = new BindingList<Binder> { new Binder { Name = "A" } };

它将在没有任何其他更改的情况下正常工作。

关键是BindingList<T>实现IBindingList,它将在列表更改时通知控件。这允许CheckedListBox控件更新其状态。这是双向数据绑定。

此外,您可以更改这两行:

checkedListBox1.Invalidate();
checkedListBox1.Update();

对此(更具可读性,基本上做同样的事情):

checkedListBox1.Refresh();

答案 1 :(得分:3)

您可能希望看到两件事:

  1. 使用BindingList
  2. 名称属性
  3. 中添加BindableAttribute

答案 2 :(得分:1)

您的List<Bender>是否需要成为某种可观察的集合,例如ObservableCollection<Bender>

答案 3 :(得分:0)

绑定选中列表框的正确方法是:

List<YourType> data = new List<YourType>();
checkedListBox1.DataSource = new BindingList<YourType>(data);
checkedListBox1.DisplayMember = nameof(YourType.Name);
checkedListBox1.ValueMember = nameof(YourType.ID);

自我提醒。

我每次绑定时遇到的问题是intellisense不建议使用DataSourceDisplayMemberValueMember属性< /strong> 我很困惑。