|
|
@@ -265,6 +265,43 @@ namespace Avalonia.Collections
|
|
|
{
|
|
|
return new DataGridPathSortDescription(propertyPath, direction, comparer, null);
|
|
|
}
|
|
|
+
|
|
|
+ public static DataGridSortDescription FromComparer(IComparer comparer, ListSortDirection direction = ListSortDirection.Ascending)
|
|
|
+ {
|
|
|
+ return new DataGridComparerSortDesctiption(comparer, direction);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public class DataGridComparerSortDesctiption : DataGridSortDescription
|
|
|
+ {
|
|
|
+ private readonly IComparer _innerComparer;
|
|
|
+ private readonly ListSortDirection _direction;
|
|
|
+ private readonly IComparer<object> _comparer;
|
|
|
+
|
|
|
+ public IComparer SourceComparer => _innerComparer;
|
|
|
+ public override IComparer<object> Comparer => _comparer;
|
|
|
+ public override ListSortDirection Direction => _direction;
|
|
|
+ public DataGridComparerSortDesctiption(IComparer comparer, ListSortDirection direction)
|
|
|
+ {
|
|
|
+ _innerComparer = comparer;
|
|
|
+ _direction = direction;
|
|
|
+ _comparer = Comparer<object>.Create((x, y) => Compare(x, y));
|
|
|
+ }
|
|
|
+
|
|
|
+ private int Compare(object x, object y)
|
|
|
+ {
|
|
|
+ int result = _innerComparer.Compare(x, y);
|
|
|
+
|
|
|
+ if (Direction == ListSortDirection.Descending)
|
|
|
+ return -result;
|
|
|
+ else
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ public override DataGridSortDescription SwitchSortDirection()
|
|
|
+ {
|
|
|
+ var newDirection = _direction == ListSortDirection.Ascending ? ListSortDirection.Descending : ListSortDirection.Ascending;
|
|
|
+ return new DataGridComparerSortDesctiption(_innerComparer, newDirection);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
public class DataGridSortDescriptionCollection : AvaloniaList<DataGridSortDescription>
|