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