CheckedListBox检查列表项属性绑定到类中的字段

kaw*_*awa 5 c# data-binding winforms

我有一个具有两个属性的类,我想将它绑定到CheckedListBox项.WebsiteName属性将是DisplayValue,IsChecked应该是项目的Checked状态:

public class ACLASS:
{       
    public string WebsiteName 
    { 
        get;
        set;
    }

    public bool IsChecked
    {
        get;
        set;
    }

    public ACLASS() 
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

这就是我'尝试'绑定它的方式:

    ACLASS aclass = new ACLASS();
    aclass.WebsiteName = "www.example.com";
    BindingList<ACLASS> list = new BindingList<ACLASS>();
    list.Add(aclass);

    checkedlistbox.DataSource    = list;
    checkedlistbox.DisplayMember = "WebsiteName";       
Run Code Online (Sandbox Code Playgroud)

这一切都很好,但是如何将CheckedListBox中项目的Checked状态与类的IsChecked属性绑定,所以当我检查CheckedListBox中的项目时,它还会更改ACLASS实例的IsChecked属性?我需要这个,所以我可以通过ACLASS实例验证项目的检查状态.

Lar*_*ech 6

CheckedListBox控件并不真正支持DataSource,这就是设计师将其隐藏在Intellisense中的原因.您可以使用它,但即使您将ValueMember属性设置为布尔属性,列表框的checkmark属性也不适用于您的类.

不幸的是,这意味着您必须自己设置值:

checkedlistbox.DataSource = list;
checkedlistbox.DisplayMember = "WebsiteName";
for (int i = 0; i < checkedListbox.Items.Count; ++i) {
  checkedListbox.SetItemChecked(i, ((ACLASS)checkedListbox.Items[i]).IsChecked);
}
Run Code Online (Sandbox Code Playgroud)

而且您还必须自己跟踪更改:

checkedListBox1.ItemCheck += (sender, e) => {
  list[e.Index].IsChecked = (e.NewValue != CheckState.Unchecked);
};
Run Code Online (Sandbox Code Playgroud)