最近在优化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)来更新指定索引

最新文章

  1. LR破解版录制手机脚本(一)模拟器录制
  2. 数据库连接池原理 与实现(动脑学院Jack老师课后自己的练习有感)
  3. 设置XtraForm标题居中
  4. vue通过判断写样式(v-bind)
  5. codeforces 653A Bear and Three Balls
  6. Greg and Array
  7. Oracle oerr使用
  8. Java输入输出流(1)
  9. C#中泛型、程序集一些基本运用(Fifteenth Day)
  10. NPY and girls
  11. Example002定时打开窗口
  12. Orcle导入导出dmp文件
  13. Fatal error: Class &#39;LearningPHP1\mysqli&#39; not found
  14. python操作mysql,增,删,改,查
  15. 如何让Mac、Windows可以互相远程
  16. C#开发APP,ToolBar控件在Smobiler中的使用方式【附案例源码】——Smobiler移动开发平台
  17. css对齐方案总结
  18. Python编程Day3—基本运算符、数据类型
  19. Best Chrome Extensions
  20. SpringMVC源码阅读入门

热门文章

  1. 看完这篇还不会自定义 View ,我跪搓衣板
  2. request 请求转发
  3. JavaScript读书笔记(6)-Function
  4. JavaWeb、J2-SE开发框架——Spring
  5. OpenCV 中的三大数据类型( 概述 )
  6. Linux NAT网络连接权威指南
  7. swift基础教程笔记
  8. ios --转载 使用SMSSDK实现短信验证:
  9. 【BZOJ4237】稻草人 cdq分治+单调栈+二分
  10. 观察OnPaint与OnIdle与OnSize事件