using System; using System.Collections.Generic; using System.ComponentModel; namespace chc.servicemanagertray { public class SortableBindingList : BindingList { private readonly Dictionary> comparers; private bool isSorted; private ListSortDirection listSortDirection; private PropertyDescriptor propertyDescriptor; public SortableBindingList() : base(new List()) { this.comparers = new Dictionary>(); } public SortableBindingList(IEnumerable enumeration) : base(new List(enumeration)) { this.comparers = new Dictionary>(); } protected override bool SupportsSortingCore { get { return true; } } protected override bool IsSortedCore { get { return this.isSorted; } } protected override PropertyDescriptor SortPropertyCore { get { return this.propertyDescriptor; } } protected override ListSortDirection SortDirectionCore { get { return this.listSortDirection; } } protected override bool SupportsSearchingCore { get { return true; } } protected override void ApplySortCore(PropertyDescriptor property, ListSortDirection direction) { List itemsList = (List)this.Items; Type propertyType = property.PropertyType; PropertyComparer comparer; if (!this.comparers.TryGetValue(propertyType, out comparer)) { comparer = new PropertyComparer(property, direction); this.comparers.Add(propertyType, comparer); } comparer.SetPropertyAndDirection(property, direction); itemsList.Sort(comparer); this.propertyDescriptor = property; this.listSortDirection = direction; this.isSorted = true; this.OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1)); } protected override void RemoveSortCore() { this.isSorted = false; this.propertyDescriptor = base.SortPropertyCore; this.listSortDirection = base.SortDirectionCore; this.OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1)); } protected override int FindCore(PropertyDescriptor property, object key) { int count = this.Count; for (int i = 0; i < count; ++i) { T element = this[i]; if (property.GetValue(element).Equals(key)) { return i; } } return -1; } } }