2016-08-22 44 views
1

的選中狀態我試圖這樣設置CheckedListBox的數據源:CheckedListBox數據綁定到項目

private void Form1_Load(object sender, EventArgs e) 
    { 
     checkedListBox1.DisplayMember = "Name"; 
     checkedListBox1.ValueMember = "Checked"; 
     _bindingList = new BindingList<CustomBindingClass>(
      new List<CustomBindingClass> 
     { 
      new CustomBindingClass {Checked = CheckState.Checked, Name = "Item1"}, 
      new CustomBindingClass {Checked = CheckState.Checked, Name = "Item2"}, 
      new CustomBindingClass {Checked = CheckState.Unchecked, Name = "Item3"}, 
     }); 
     checkedListBox1.DataSource = _bindingList; 
    } 

和它的工作,但部分。我能夠做的休耕後

_bindingList.RemoveAt(0); 

_bindingList[0].Name = "TestTest";和CheckedListBox更新以及除不檢查的項目。這不是工作

_bindingList[0].Checked=CheckState.Checked; 

我還測試這樣做時,Checked物業從我CustomBindingClass是bool類型的,但不工作或者。任何建議什麼應該是ValueMember屬性的類型?

+0

'CustomBindingClass'需要實現'INotifyPropertyChanged'(或任何它被調用的) – leppie

回答

3

考慮以下事實:

  1. CheckedListBox簡化版,有一個內置的檢查項目的數據綁定支持。你需要自己處理物品的檢查狀態。您可以設置checkedListBox1.ValueMember = "Checked";你沒有設置項目檢查狀態,你剛纔說當你選擇該項目時,由SelectedValue返回的值來自你的對象的Checked屬性。例如,您可以在ButtonClick事件中使用此代碼來查看結果;不管項目,消息框的檢查狀態,將顯示該項目背後的對象Checked屬性的值:

    MessageBox.Show(checkedListBox1.SelectedValue.ToString()); 
    
  2. 選擇和檢查項目是完全不同的。

我更喜歡用DataGridView來達到這個目的。您可以簡單地使用CheckBox列和只讀TextBox列,並將DataGridView綁定到對象列表。

如果您需要雙向數據綁定,則無論您使用何種控件顯示數據,都需要實現INotifyPropertyChanged接口。如果您沒有實現該界面,那麼當更改模型上的屬性時ListChange事件不會引發,並且您無法自動查看UI中的更改。

+0

我知道你想使用數據綁定來檢查和取消選中'CheckedListBox'的項目。但不幸的是,它沒有內置的數據綁定支持來檢查狀態。 –

1

如果你看一看CheckedListBox類,你會發現DataSourceDisplayMemberValueMember標有

[Browsable(false)] 
[EditorBrowsable(EditorBrowsableState.Never)] 

這在Windows中常用的技術窗體控件表明,一些公共屬性繼承自基類(因此不能被刪除)不適用於那個具體的派生類,不應該被使用。

對於上述CheckedListBox的屬性,必須有這樣做的理由。正如你已經看到的那樣,這是「有用的工作」,但重要的是它不能保證工作。所以不要使用它們。如果您願意,請創建一個助手類,該助手類包含CheckedListBoxBindingList,監聽ListChanged事件並同步控件。

相關問題