CheckedListBox 数据绑定到项目的选中状态

Mil*_*los 1 .net c# data-binding checkedlistbox winforms

我尝试像这样设置 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;
    }
Run Code Online (Sandbox Code Playgroud)

它正在工作,但部分有效。我稍后可以做以下事情

_bindingList.RemoveAt(0);
Run Code Online (Sandbox Code Playgroud)

_bindingList[0].Name = "TestTest";和 CheckedListBox 更新良好,但未检查项目。这不起作用

_bindingList[0].Checked=CheckState.Checked;
Run Code Online (Sandbox Code Playgroud)

Checked我还测试了当我的属性为bool 类型时执行此操作CustomBindingClass,但也不起作用。有什么建议应该是什么类型的ValueMember财产吗?

Rez*_*aei 5

考虑以下事实:

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

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

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

我更喜欢用于DataGridView这样的目的。您可以简单地拥有一个CheckBox列和一个只读TextBox列并绑定DataGridView到对象列表。

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