using System.Collections; using System.ComponentModel; namespace System.Windows.Forms { public partial class ListControl : Control { protected new System.Windows.Controls.Primitives.Selector control { get; private set; } public ObjectCollection Items { get; private set; } public int SelectedIndex { get => control.SelectedIndex; set => control.SelectedIndex = value; } public object SelectedItem { get => control.SelectedItem; set => control.SelectedItem = value; } public bool FormattingEnabled { get; set; } public bool IntegralHeight { get; set; } // TODO? private bool sorted; public bool Sorted { get => sorted; set { if (value != sorted) { sorted = value; if (value) control.Items.SortDescriptions.Add(new SortDescription("", ListSortDirection.Ascending)); else control.Items.SortDescriptions.Clear(); } } } public object DataSource { get => control.ItemsSource; set { control.Items.Clear(); control.ItemsSource = value as IEnumerable; } } public event EventHandler SelectedIndexChanged; public event EventHandler SelectedValueChanged; protected virtual void OnSelectionChanged(EventArgs e) { OnSelectedIndexChanged(e); OnSelectedValueChanged(e); } // mimic winforms behavior: do not raise events if the list is empty (for example, when we clear it) protected virtual void OnSelectedIndexChanged(EventArgs e) { if (Items.Count > 0) SelectedIndexChanged?.Invoke(this, e); } protected virtual void OnSelectedValueChanged(EventArgs e) { if (Items.Count > 0) SelectedValueChanged?.Invoke(this, e); } protected void SetControl(System.Windows.Controls.Primitives.Selector control) { base.SetControl(control); this.control = control; control.SelectionChanged += (sender, e) => OnSelectionChanged(e); Items = new ObjectCollection(control.Items); } protected internal virtual object GetItem(int index) => Items[index]; public int FindStringExact(string text) { for (int i = 0; i < Items.Count; i++) if (GetItem(i).ToString() == text) return i; return -1; } public int FindString(string text) { for (int i = 0; i < Items.Count; i++) if (GetItem(i).ToString().StartsWith(text, StringComparison.OrdinalIgnoreCase)) return i; return -1; } public string GetItemText(object item) { return item?.ToString() ?? ""; } public void BeginUpdate() { } public void EndUpdate() { } } }