Skip to content

Commit

Permalink
Merge pull request #5847 from sdoroff/datagridcolumn-sortcomparer
Browse files Browse the repository at this point in the history
Added IComparer sorting to DataGridColumn
  • Loading branch information
Dan Walmsley committed Apr 30, 2021
1 parent 9338571 commit 4336ec9
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -265,6 +265,43 @@ public static DataGridSortDescription FromPath(string propertyPath, ListSortDire
{
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>
Expand Down
16 changes: 16 additions & 0 deletions src/Avalonia.Controls.DataGrid/DataGridColumn.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1009,6 +1009,14 @@ public string SortMemberPath
get;
set;
}
/// <summary>
/// Holds a Comparer to use for sorting, if not using the default.
/// </summary>
public System.Collections.IComparer CustomSortComparer
{
get;
set;
}

/// <summary>
/// We get the sort description from the data source. We don't worry whether we can modify sort -- perhaps the sort description
Expand All @@ -1020,6 +1028,14 @@ internal DataGridSortDescription GetSortDescription()
&& OwningGrid.DataConnection != null
&& OwningGrid.DataConnection.SortDescriptions != null)
{
if(CustomSortComparer != null)
{
return
OwningGrid.DataConnection.SortDescriptions
.OfType<DataGridComparerSortDesctiption>()
.FirstOrDefault(s => s.SourceComparer == CustomSortComparer);
}

string propertyName = GetSortPropertyName();

return OwningGrid.DataConnection.SortDescriptions.FirstOrDefault(s => s.HasPropertyPath && s.PropertyPath == propertyName);
Expand Down
6 changes: 6 additions & 0 deletions src/Avalonia.Controls.DataGrid/DataGridColumnHeader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,12 @@ internal void ProcessSort(KeyModifiers keyModifiers)
owningGrid.DataConnection.SortDescriptions.Add(newSort);
}
}
else if (OwningColumn.CustomSortComparer != null)
{
newSort = DataGridSortDescription.FromComparer(OwningColumn.CustomSortComparer);

owningGrid.DataConnection.SortDescriptions.Add(newSort);
}
else
{
string propertyName = OwningColumn.GetSortPropertyName();
Expand Down

0 comments on commit 4336ec9

Please sign in to comment.