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
属性的类型?
考虑以下事实:
-
CheckedListBox
没有内置的数据绑定支持来检查项目。 您需要自己处理项目的检查状态。 -
你设置了
checkedListBox1.ValueMember = "Checked";
。 您没有设置项目检查状态,您刚才说当您选择项目时,由SelectedValue
返回的值来自您的对象的Checked
属性,该属性位于所见项目的后面。 例如,您可以在Button
的Click
事件中使用此代码来查看结果; 无论项目的检查状态如何,消息框都会显示项目后面对象的Checked
属性值:MessageBox.Show(checkedListBox1.SelectedValue.ToString());
-
选择和检查项目是完全不同的。
我更喜欢将DataGridView
用于此目的。 您可以只使用CheckBox
列和只读TextBox
列,并将DataGridView
绑定到对象列表。
如果需要双向数据绑定,则无论使用何种控件来显示数据,都需要实现INotifyPropertyChanged
接口。 如果未实现该接口,则更改模型ListChange
事件的属性时不会引发,并且您无法自动查看UI中的更改。
如果你看看CheckedListBox
类,你会发现DataSource
, DisplayMember
和ValueMember
都标有
[Browsable(false)] [EditorBrowsable(EditorBrowsableState.Never)]
这是Windows窗体控件中使用的常用技术,用于指示从基类inheritance的某些公共属性(因此无法删除)不适用于该具体派生类,因此不应使用。
必须有理由为CheckedListBox
的上述属性执行此操作。 正如你已经看到的那样,它“有点工作”,但重点是它不能保证完全正常工作。 所以不要使用它们。 如果您愿意,创建一个包含CheckedListBox
和BindingList
的帮助器类,侦听ListChanged
事件并同步控件。