合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
最近在优化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)来更新指定索引 ~~~ ~~~ ~~~