为BindingList添加Sort

最近在优化WPF性能时, 发现在特定条件下BindingList比ObservableCollection性能更高, 因为它提供Disable/Enable 更改通知的方法。这样我们可以不需要很频繁的通知UI去更新, 而是等所有操作都做完后再通知。

然而, 默认的BindingList不支持Sort, 需要我们实现。

  public class SortableBindingList<T> : BindingList<T>     {         // Fields         private bool isSorted;         private ListSortDirection listSortDirection;         private PropertyDescriptor propertyDescriptor;           // Methods         public SortableBindingList()         {         }           public SortableBindingList(IList<T> list)             : this()         {             base.Items.Clear();             foreach (T local in list)             {                 base.Add(local);             }         }           protected override void ApplySortCore(PropertyDescriptor prop, ListSortDirection direction)         {             (base.Items as List<T>).Sort(this.GetComparisionDelegate(prop, direction));         }           private Comparison<T> GetComparisionDelegate(PropertyDescriptor propertyDescriptor, ListSortDirection direction)         {             return delegate(T t1, T t2)             {                 int num2;                 ((SortableBindingList<T>)this).propertyDescriptor = propertyDescriptor;                 ((SortableBindingList<T>)this).listSortDirection = direction;                 ((SortableBindingList<T>)this).isSorted = true;                 int num = (direction == ListSortDirection.Ascending) ? 1 : -1;                 if (propertyDescriptor.PropertyType == typeof(string))                 {                     num2 = StringComparer.CurrentCulture.Compare(propertyDescriptor.GetValue(t1), propertyDescriptor.GetValue(t2));                 }                 else                 {                     num2 = Comparer.Default.Compare(propertyDescriptor.GetValue(t1), propertyDescriptor.GetValue(t2));                 }                 return (num * num2);             };         }           protected override void RemoveSortCore()         {             this.isSorted = false;             this.propertyDescriptor = base.SortPropertyCore;             this.listSortDirection = base.SortDirectionCore;         }           // Properties         protected override bool IsSortedCore         {             get             {                 return this.isSorted;             }         }           protected override ListSortDirection SortDirectionCore         {             get             {                 return this.listSortDirection;             }         }           protected override PropertyDescriptor SortPropertyCore         {             get             {                 return this.propertyDescriptor;             }         }           protected override bool SupportsSortingCore         {             get             {                 return true;             }         }     } 



 调用RaiseListChangedEvents = false 或者RaiseListChangedEvents = true来控制更改通知, 
调用ResetBindings()来全部更新, 或者ResetItem(index)来更新指定索引
 
 

你可能感兴趣的:(C#)