2011-08-03 34 views
2

我使用的WinForms C# 有没有什么办法让以下行为:试图绑定列表<T>到CheckedListBox中的WinForms C#

  1. 绑定列表到CheckedListBox
  2. 当我添加元素列出CheckedList箱refereshes
  3. 当我改变CheckedListBox列表改变

我试着做到以下几点:

构造函数代码:

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

场:

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

在Button1的Click:

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

但认为不会更新。

谢谢。

+0

是列表框大到足以容纳新的复选框? – MrFox

回答

3

两件事情,你不妨看看:

  1. 使用BindingList
  2. 添加BindableAttribute名称财产
+0

要创建'a'BindingList? 'a'上的BindableAttribute? –

+0

@Sergey Kucher - antisanity为您提供了两个链接。如果你不确定它们的含义,在链接上有一个全面的代码示例。 – Tim

1

List<Bender>需要是某种可观测收集,如ObservableCollection<Bender>而不是?

+0

可能,请你给我一些代码示例,你是什么意思 –

6

改变这一行:

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

这样:

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

都可以正常运行,没有任何其他的变化。

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

另外,你可以改变这两条线路:

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

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

checkedListBox1.Refresh(); 
相关问题