namespace System.Windows.Forms { public partial class CheckedListBox : ListBox { private static string template = "" + "" + "" + "" + "" + ""; private static System.Windows.DataTemplate dataTemplate = (System.Windows.DataTemplate)System.Windows.Markup.XamlReader.Parse(template); public new ObjectCollection Items { get; } public new object SelectedItem { get => SelectedIndex == -1 ? null : Items[SelectedIndex]; set => SelectedIndex = Items.IndexOf(value); } private CheckedItemCollection checkedItems; public CheckedItemCollection CheckedItems { get { if (checkedItems == null) BuildCheckedItems(); return checkedItems; } } private CheckedIndexCollection checkedIndices; public CheckedIndexCollection CheckedIndices { get { if (checkedIndices == null) BuildCheckedIndices(); return checkedIndices; } } public bool CheckOnClick { get; set; } // TODO? public event ItemCheckEventHandler ItemCheck; private void BuildCheckedItems() { checkedItems = new CheckedItemCollection(); for (int i = 0; i < control.Items.Count; i++) { var item = control.Items[i] as Item; if (item.IsChecked == true) checkedItems.Add(item); } } private void BuildCheckedIndices() { checkedIndices = new CheckedIndexCollection(); for (int i = 0; i < control.Items.Count; i++) { var item = control.Items[i] as Item; if (item.IsChecked == true) checkedIndices.Add(i); } } private void ClearCheckedItems() { checkedItems = null; checkedIndices = null; } protected internal override object GetItem(int index) => Items[index]; protected virtual void OnItemCheck(ItemCheckEventArgs args) { ClearCheckedItems(); ItemCheck?.Invoke(this, args); } public void SetItemCheckState(int index, CheckState value) { ((Item)control.Items[index]).SetState(value); } public void SetItemChecked(int index, bool value) { SetItemCheckState(index, value ? CheckState.Checked : CheckState.Unchecked); } public CheckedListBox() { control.ItemTemplate = dataTemplate; Items = new ObjectCollection(this, control.Items); } } }