CheckedListBox数据绑定到Items的checked状态

时间:2016-08-22 09:24:04

标签: c# .net winforms data-binding checkedlistbox

我尝试像这样设置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属性的类型吗?

2 个答案:

答案 0 :(得分:3)

考虑以下事实:

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

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

    Checked
  3. 选择和检查项目完全不同。

  4. 我更喜欢将MessageBox.Show(checkedListBox1.SelectedValue.ToString()); 用于此目的。您只需拥有DataGridView列和只读CheckBox列,并将TextBox绑定到对象列表即可。

    如果您需要双向数据绑定,则无论您使用什么控件来显示数据,都需要实现INotifyPropertyChanged接口。如果您没有实现该界面,那么更改模型DataGridView事件的属性时不会引发,并且您无法自动看到UI中的更改。

答案 1 :(得分:1)

如果您查看CheckedListBox课程,您会注意到DataSourceDisplayMemberValueMember标有

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

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

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