ListControl.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. using System.Collections;
  2. using System.ComponentModel;
  3. namespace System.Windows.Forms
  4. {
  5. public partial class ListControl : Control
  6. {
  7. protected new System.Windows.Controls.Primitives.Selector control { get; private set; }
  8. public ObjectCollection Items { get; private set; }
  9. public int SelectedIndex
  10. {
  11. get => control.SelectedIndex;
  12. set => control.SelectedIndex = value;
  13. }
  14. public object SelectedItem
  15. {
  16. get => control.SelectedItem;
  17. set => control.SelectedItem = value;
  18. }
  19. public bool FormattingEnabled { get; set; }
  20. public bool IntegralHeight { get; set; } // TODO?
  21. private bool sorted;
  22. public bool Sorted
  23. {
  24. get => sorted;
  25. set
  26. {
  27. if (value != sorted)
  28. {
  29. sorted = value;
  30. if (value)
  31. control.Items.SortDescriptions.Add(new SortDescription("", ListSortDirection.Ascending));
  32. else
  33. control.Items.SortDescriptions.Clear();
  34. }
  35. }
  36. }
  37. public object DataSource
  38. {
  39. get => control.ItemsSource;
  40. set
  41. {
  42. control.Items.Clear();
  43. control.ItemsSource = value as IEnumerable;
  44. }
  45. }
  46. public event EventHandler SelectedIndexChanged;
  47. public event EventHandler SelectedValueChanged;
  48. protected virtual void OnSelectionChanged(EventArgs e)
  49. {
  50. OnSelectedIndexChanged(e);
  51. OnSelectedValueChanged(e);
  52. }
  53. // mimic winforms behavior: do not raise events if the list is empty (for example, when we clear it)
  54. protected virtual void OnSelectedIndexChanged(EventArgs e)
  55. {
  56. if (Items.Count > 0)
  57. SelectedIndexChanged?.Invoke(this, e);
  58. }
  59. protected virtual void OnSelectedValueChanged(EventArgs e)
  60. {
  61. if (Items.Count > 0)
  62. SelectedValueChanged?.Invoke(this, e);
  63. }
  64. protected void SetControl(System.Windows.Controls.Primitives.Selector control)
  65. {
  66. base.SetControl(control);
  67. this.control = control;
  68. control.SelectionChanged += (sender, e) => OnSelectionChanged(e);
  69. Items = new ObjectCollection(control.Items);
  70. }
  71. protected internal virtual object GetItem(int index) => Items[index];
  72. public int FindStringExact(string text)
  73. {
  74. for (int i = 0; i < Items.Count; i++)
  75. if (GetItem(i).ToString() == text)
  76. return i;
  77. return -1;
  78. }
  79. public int FindString(string text)
  80. {
  81. for (int i = 0; i < Items.Count; i++)
  82. if (GetItem(i).ToString().StartsWith(text, StringComparison.OrdinalIgnoreCase))
  83. return i;
  84. return -1;
  85. }
  86. public string GetItemText(object item)
  87. {
  88. return item?.ToString() ?? "";
  89. }
  90. public void BeginUpdate() { }
  91. public void EndUpdate() { }
  92. }
  93. }