forked from ddeml/LoxStatEdit
-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathSortableBindingList.cs
More file actions
70 lines (64 loc) · 2.34 KB
/
SortableBindingList.cs
File metadata and controls
70 lines (64 loc) · 2.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
using System;
using System.Collections.Generic;
using System.ComponentModel;
namespace LoxStatEdit
{
public class SortableBindingList<T> : BindingList<T>
{
private bool _isSorted;
private ListSortDirection _sortDirection;
private PropertyDescriptor _sortProperty;
protected override bool SupportsSortingCore => true;
protected override bool IsSortedCore => _isSorted;
protected override PropertyDescriptor SortPropertyCore => _sortProperty;
protected override ListSortDirection SortDirectionCore => _sortDirection;
protected override void ApplySortCore(PropertyDescriptor prop, ListSortDirection direction)
{
_sortProperty = prop;
_sortDirection = direction;
List<T> items = this.Items as List<T>;
if (items != null)
{
items.Sort(delegate (T lhs, T rhs)
{
int result = OnComparison(lhs, rhs);
if (_sortDirection == ListSortDirection.Descending)
{
result = -result;
}
return result;
});
}
_isSorted = true;
this.OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
}
private int OnComparison(T lhs, T rhs)
{
object lhsValue = lhs == null ? null : _sortProperty.GetValue(lhs);
object rhsValue = rhs == null ? null : _sortProperty.GetValue(rhs);
if (lhsValue == null)
{
return (rhsValue == null) ? 0 : -1; // nulls are equal
}
if (rhsValue == null)
{
return 1; // first has value, second doesn't
}
if (lhsValue is IComparable)
{
return ((IComparable)lhsValue).CompareTo(rhsValue);
}
if (lhsValue.Equals(rhsValue))
{
return 0; // both are the same
}
// not comparable, compare ToString
return lhsValue.ToString().CompareTo(rhsValue.ToString());
}
protected override void RemoveSortCore()
{
_isSorted = false;
this.OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
}
}
}