zoukankan      html  css  js  c++  java
  • 为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)来更新指定索引
  • 相关阅读:
    notepad++中使用正则表达式
    python 使用多线程
    EMS查看及修改邮箱发送和接受邮件大小的方法
    EMS修改邮箱容量限制的方法
    EMS查看邮箱容量限制的方法
    EMS批量为用户分配邮箱
    EMS已有用户分配邮箱方法
    EMS创建独立新用户并分配邮箱
    【转载】【zabbix】自定义监控项key值
    Centos6.9 安装zabbix3.4 过程
  • 原文地址:https://www.cnblogs.com/muzizongheng/p/3170893.html
Copyright © 2011-2022 走看看