CheckedListBox数据绑定到Items的checked状态

我试图像这样设置CheckedListBox的DataSource:

private void Form1_Load(object sender, EventArgs e) { checkedListBox1.DisplayMember = "Name"; checkedListBox1.ValueMember = "Checked"; _bindingList = new BindingList( new List { 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; 

当我的CustomBindingClass Checked属性类型为bool时,我也测试过它,但是也不起作用。 任何建议应该是ValueMember属性的类型?

考虑以下事实:

  1. CheckedListBox没有内置的数据绑定支持来检查项目。 您需要自己处理项目的检查状态。

  2. 你设置了checkedListBox1.ValueMember = "Checked"; 。 您没有设置项目检查状态,您刚才说当您选择项目时,由SelectedValue返回的值来自您的对象的Checked属性,该属性位于所见项目的后面。 例如,您可以在ButtonClick事件中使用此代码来查看结果; 无论项目的检查状态如何,消息框都会显示项目后面对象的Checked属性值:

     MessageBox.Show(checkedListBox1.SelectedValue.ToString()); 
  3. 选择和检查项目是完全不同的。

我更喜欢将DataGridView用于此目的。 您可以只使用CheckBox列和只读TextBox列,并将DataGridView绑定到对象列表。

如果需要双向数据绑定,则无论使用何种控件来显示数据,都需要实现INotifyPropertyChanged接口。 如果未实现该接口,则更改模型ListChange事件的属性时不会引发,并且您无法自动查看UI中的更改。

如果你看看CheckedListBox类,你会发现DataSourceDisplayMemberValueMember都标有

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

这是Windows窗体控件中使用的常用技术,用于指示从基类inheritance的某些公共属性(因此无法删除)不适用于该具体派生类,因此不应使用。

必须有理由为CheckedListBox的上述属性执行此操作。 正如你已经看到的那样,它“有点工作”,但重点是它不能保证完全正常工作。 所以不要使用它们。 如果您愿意,创建一个包含CheckedListBoxBindingList的帮助器类,侦听ListChanged事件并同步控件。