2011-08-03 56 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(); 
相關問題