using System;
using System.Collections.Generic;
using System.ComponentModel;
///
/// 提供支持数据绑定的泛型集合
///
///
public class BindingCollection : BindingList
{
private bool _isSortedCore = true;
private ListSortDirection _sortDirectionCore = ListSortDirection.Ascending;
private PropertyDescriptor _sortPropertyCore = null;
///
/// 是否已排序
///
protected override bool IsSortedCore
{
get { return _isSortedCore; }
}
///
/// 获取列表的排序方向
///
protected override ListSortDirection SortDirectionCore
{
get { return _sortDirectionCore; }
}
///
/// 获取用于对列表排序的属性说明符
///
protected override PropertyDescriptor SortPropertyCore
{
get { return _sortPropertyCore; }
}
///
/// 是否支持排序
///
protected override bool SupportsSortingCore
{
get { return true; }
}
///
/// 是否支持搜索
///
protected override bool SupportsSearchingCore
{
get { return true; }
}
///
/// 构造函数
///
public BindingCollection()
{ }
///
/// 构造函数
///
///
public BindingCollection(IList list)
: base(list)
{ }
///
/// 对项排序
///
///
///
protected override void ApplySortCore(PropertyDescriptor property, ListSortDirection direction)
{
List items = this.Items as List;
if (items != null)
{
ObjectPropertyCompare pc = new ObjectPropertyCompare(property, direction);
items.Sort(pc);
_isSortedCore = true;
_sortDirectionCore = direction;
_sortPropertyCore = property;
}
else
{
_isSortedCore = false;
}
this.OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
}
///
/// 移除排序
///
protected override void RemoveSortCore()
{
_isSortedCore = false;
this.OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
}
}
public class ObjectPropertyCompare : IComparer
{
///
/// 属性
///
public PropertyDescriptor Property { get; set; }
///
/// 排序方向
///
public ListSortDirection Direction { get; set; }
///
/// 构造函数
///
public ObjectPropertyCompare()
{ }
///
/// 构造函数
///
///
///
public ObjectPropertyCompare(PropertyDescriptor property, ListSortDirection direction)
{
Property = property;
Direction = direction;
}
///
/// 比较两个对象
///
///
///
///
public int Compare(T x, T y)
{
object xValue = x.GetType().GetProperty(Property.Name).GetValue(x, null);
object yValue = y.GetType().GetProperty(Property.Name).GetValue(y, null);
int returnValue;
if (xValue == null && yValue == null)
{
returnValue = 0;
}
else if (xValue == null)
{
returnValue = -1;
}
else if (yValue == null)
{
returnValue = 1;
}
else if (xValue is IComparable)
{
returnValue = ((IComparable)xValue).CompareTo(yValue);
}
else if (xValue.Equals(yValue))
{
returnValue = 0;
}
else
{
returnValue = xValue.ToString().CompareTo(yValue.ToString());
}
if (Direction == ListSortDirection.Ascending)
{
return returnValue;
}
else
{
return returnValue * -1;
}
}
}