为BindingList添加Sort

来源:互联网 发布:java如何定义一个方法 编辑:程序博客网 时间:2024/06/04 00:01
最近在优化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)来更新指定索引