为BindingList添加Sort
2024-09-02 12:58:59
最近在优化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)来更新指定索引
最新文章
- LR破解版录制手机脚本(一)模拟器录制
- 数据库连接池原理 与实现(动脑学院Jack老师课后自己的练习有感)
- 设置XtraForm标题居中
- vue通过判断写样式(v-bind)
- codeforces 653A Bear and Three Balls
- Greg and Array
- Oracle oerr使用
- Java输入输出流(1)
- C#中泛型、程序集一些基本运用(Fifteenth Day)
- NPY and girls
- Example002定时打开窗口
- Orcle导入导出dmp文件
- Fatal error: Class &#39;LearningPHP1\mysqli&#39; not found
- python操作mysql,增,删,改,查
- 如何让Mac、Windows可以互相远程
- C#开发APP,ToolBar控件在Smobiler中的使用方式【附案例源码】——Smobiler移动开发平台
- css对齐方案总结
- Python编程Day3—基本运算符、数据类型
- Best Chrome Extensions
- SpringMVC源码阅读入门