2016-08-22 67 views
1

的选中状态我试图这样设置CheckedListBox的数据源:CheckedListBox数据绑定到项目

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

'CustomBindingClass'需要实现'INotifyPropertyChanged'(或任何它被调用的) – leppie

回答

3

考虑以下事实:

  1. CheckedListBox简化版,有一个内置的检查项目的数据绑定支持。你需要自己处理物品的检查状态。您可以设置checkedListBox1.ValueMember = "Checked";你没有设置项目检查状态,你刚才说当你选择该项目时,由SelectedValue返回的值来自你的对象的Checked属性。例如,您可以在ButtonClick事件中使用此代码来查看结果;不管项目,消息框的检查状态,将显示该项目背后的对象Checked属性的值:

    MessageBox.Show(checkedListBox1.SelectedValue.ToString()); 
    
  2. 选择和检查项目是完全不同的。

我更喜欢用DataGridView来达到这个目的。您可以简单地使用CheckBox列和只读TextBox列,并将DataGridView绑定到对象列表。

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

+0

我知道你想使用数据绑定来检查和取消选中'CheckedListBox'的项目。但不幸的是,它没有内置的数据绑定支持来检查状态。 –

1

如果你看一看CheckedListBox类,你会发现DataSourceDisplayMemberValueMember标有

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

这在Windows中常用的技术窗体控件表明,一些公共属性继承自基类(因此不能被删除)不适用于那个具体的派生类,不应该被使用。

对于上述CheckedListBox的属性,必须有这样做的理由。正如你已经看到的那样,这是“有用的工作”,但重要的是它不能保证工作。所以不要使用它们。如果您愿意,请创建一个助手类,该助手类包含CheckedListBoxBindingList,监听ListChanged事件并同步控件。

相关问题