【问题标题】:CheckedListBox data binding to checked state of ItemsCheckedListBox 数据绑定到项目的检查状态
【发布时间】:2016-08-22 09:24:03
【问题描述】:

我尝试这样设置 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;

当我的CustomBindingClass 中的CheckedProperty 是bool 类型时,我也进行了测试,但也不起作用。有什么建议 ValueMember 属性的类型应该是什么?

【问题讨论】:

  • CustomBindingClass 需要实现INotifyPropertyChanged(或其他任何名称)

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


【解决方案1】:

考虑以下事实:

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

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

    MessageBox.Show(checkedListBox1.SelectedValue.ToString());
    
  3. 选择项和勾选项完全不同。

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

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

【讨论】:

  • 我知道您想使用数据绑定来检查和取消选中 CheckedListBox 的项目。但不幸的是,它没有内置支持数据绑定来检查状态。
【解决方案2】:

如果您查看CheckedListBox 类,您会注意到DataSourceDisplayMemberValueMember 标记为

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

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

对于CheckedListBox 的上述属性,这样做一定是有原因的。正如您已经看到的,它是“某种工作”,但关键是它根本不能保证工作。所以不要使用它们。如果您愿意,可以创建一个包含CheckedListBoxBindingList 的助手类,监听ListChanged 事件并同步控件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    相关资源
    最近更新 更多