CheckedListBox.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. namespace System.Windows.Forms
  2. {
  3. public partial class CheckedListBox : ListBox
  4. {
  5. private static string template =
  6. "<DataTemplate xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'>" +
  7. "<StackPanel Orientation=\"Horizontal\">" +
  8. "<CheckBox IsChecked = \"{Binding IsChecked}\"/>" +
  9. "<TextBlock Text=\"{Binding Value}\" Margin=\"2,0,0,0\" IsHitTestVisible=\"False\"/>" +
  10. "</StackPanel>" +
  11. "</DataTemplate>";
  12. private static System.Windows.DataTemplate dataTemplate = (System.Windows.DataTemplate)System.Windows.Markup.XamlReader.Parse(template);
  13. public new ObjectCollection Items { get; }
  14. public new object SelectedItem
  15. {
  16. get => SelectedIndex == -1 ? null : Items[SelectedIndex];
  17. set => SelectedIndex = Items.IndexOf(value);
  18. }
  19. private CheckedItemCollection checkedItems;
  20. public CheckedItemCollection CheckedItems
  21. {
  22. get
  23. {
  24. if (checkedItems == null)
  25. BuildCheckedItems();
  26. return checkedItems;
  27. }
  28. }
  29. private CheckedIndexCollection checkedIndices;
  30. public CheckedIndexCollection CheckedIndices
  31. {
  32. get
  33. {
  34. if (checkedIndices == null)
  35. BuildCheckedIndices();
  36. return checkedIndices;
  37. }
  38. }
  39. public bool CheckOnClick { get; set; } // TODO?
  40. public event ItemCheckEventHandler ItemCheck;
  41. private void BuildCheckedItems()
  42. {
  43. checkedItems = new CheckedItemCollection();
  44. for (int i = 0; i < control.Items.Count; i++)
  45. {
  46. var item = control.Items[i] as Item;
  47. if (item.IsChecked == true)
  48. checkedItems.Add(item);
  49. }
  50. }
  51. private void BuildCheckedIndices()
  52. {
  53. checkedIndices = new CheckedIndexCollection();
  54. for (int i = 0; i < control.Items.Count; i++)
  55. {
  56. var item = control.Items[i] as Item;
  57. if (item.IsChecked == true)
  58. checkedIndices.Add(i);
  59. }
  60. }
  61. private void ClearCheckedItems()
  62. {
  63. checkedItems = null;
  64. checkedIndices = null;
  65. }
  66. protected internal override object GetItem(int index) => Items[index];
  67. protected virtual void OnItemCheck(ItemCheckEventArgs args)
  68. {
  69. ClearCheckedItems();
  70. ItemCheck?.Invoke(this, args);
  71. }
  72. public void SetItemCheckState(int index, CheckState value)
  73. {
  74. ((Item)control.Items[index]).SetState(value);
  75. }
  76. public void SetItemChecked(int index, bool value)
  77. {
  78. SetItemCheckState(index, value ? CheckState.Checked : CheckState.Unchecked);
  79. }
  80. public CheckedListBox()
  81. {
  82. control.ItemTemplate = dataTemplate;
  83. Items = new ObjectCollection(this, control.Items);
  84. }
  85. }
  86. }