Browse Source

Merge pull request #6730 from 0x90d/0x90d-sortDatagridColumn

Adds ability to programmatically sort the DataGrid
pull/6735/head
Tako 5 years ago
committed by GitHub
parent
commit
d0d83b511f
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 29
      src/Avalonia.Controls.DataGrid/DataGridColumn.cs
  2. 26
      src/Avalonia.Controls.DataGrid/DataGridColumnHeader.cs

29
src/Avalonia.Controls.DataGrid/DataGridColumn.cs

@ -9,6 +9,7 @@ using Avalonia.VisualTree;
using Avalonia.Collections; using Avalonia.Collections;
using Avalonia.Utilities; using Avalonia.Utilities;
using System; using System;
using System.ComponentModel;
using System.Linq; using System.Linq;
using System.Diagnostics; using System.Diagnostics;
using Avalonia.Controls.Utils; using Avalonia.Controls.Utils;
@ -653,6 +654,34 @@ namespace Avalonia.Controls
return null; return null;
} }
/// <summary>
/// Clears the current sort direction
/// </summary>
public void ClearSort()
{
//InvokeProcessSort is already validating if sorting is possible
_headerCell?.InvokeProcessSort(Input.KeyModifiers.Control);
}
/// <summary>
/// Switches the current state of sort direction
/// </summary>
public void Sort()
{
//InvokeProcessSort is already validating if sorting is possible
_headerCell?.InvokeProcessSort(Input.KeyModifiers.None);
}
/// <summary>
/// Changes the sort direction of this column
/// </summary>
/// <param name="direction">New sort direction</param>
public void Sort(ListSortDirection direction)
{
//InvokeProcessSort is already validating if sorting is possible
_headerCell?.InvokeProcessSort(Input.KeyModifiers.None, direction);
}
/// <summary> /// <summary>
/// When overridden in a derived class, causes the column cell being edited to revert to the unedited value. /// When overridden in a derived class, causes the column cell being edited to revert to the unedited value.
/// </summary> /// </summary>

26
src/Avalonia.Controls.DataGrid/DataGridColumnHeader.cs

@ -201,21 +201,21 @@ namespace Avalonia.Controls
handled = true; handled = true;
} }
internal void InvokeProcessSort(KeyModifiers keyModifiers) internal void InvokeProcessSort(KeyModifiers keyModifiers, ListSortDirection? forcedDirection = null)
{ {
Debug.Assert(OwningGrid != null); Debug.Assert(OwningGrid != null);
if (OwningGrid.WaitForLostFocus(() => InvokeProcessSort(keyModifiers))) if (OwningGrid.WaitForLostFocus(() => InvokeProcessSort(keyModifiers, forcedDirection)))
{ {
return; return;
} }
if (OwningGrid.CommitEdit(DataGridEditingUnit.Row, exitEditingMode: true)) if (OwningGrid.CommitEdit(DataGridEditingUnit.Row, exitEditingMode: true))
{ {
Avalonia.Threading.Dispatcher.UIThread.Post(() => ProcessSort(keyModifiers)); Avalonia.Threading.Dispatcher.UIThread.Post(() => ProcessSort(keyModifiers, forcedDirection));
} }
} }
//TODO GroupSorting //TODO GroupSorting
internal void ProcessSort(KeyModifiers keyModifiers) internal void ProcessSort(KeyModifiers keyModifiers, ListSortDirection? forcedDirection = null)
{ {
// if we can sort: // if we can sort:
// - AllowUserToSortColumns and CanSort are true, and // - AllowUserToSortColumns and CanSort are true, and
@ -259,7 +259,14 @@ namespace Avalonia.Controls
{ {
if (sort != null) if (sort != null)
{ {
newSort = sort.SwitchSortDirection(); if (forcedDirection == null || sort.Direction != forcedDirection)
{
newSort = sort.SwitchSortDirection();
}
else
{
newSort = sort;
}
// changing direction should not affect sort order, so we replace this column's // changing direction should not affect sort order, so we replace this column's
// sort description instead of just adding it to the end of the collection // sort description instead of just adding it to the end of the collection
@ -276,7 +283,10 @@ namespace Avalonia.Controls
} }
else if (OwningColumn.CustomSortComparer != null) else if (OwningColumn.CustomSortComparer != null)
{ {
newSort = DataGridSortDescription.FromComparer(OwningColumn.CustomSortComparer); newSort = forcedDirection != null ?
DataGridSortDescription.FromComparer(OwningColumn.CustomSortComparer, forcedDirection.Value) :
DataGridSortDescription.FromComparer(OwningColumn.CustomSortComparer);
owningGrid.DataConnection.SortDescriptions.Add(newSort); owningGrid.DataConnection.SortDescriptions.Add(newSort);
} }
@ -290,6 +300,10 @@ namespace Avalonia.Controls
} }
newSort = DataGridSortDescription.FromPath(propertyName, culture: collectionView.Culture); newSort = DataGridSortDescription.FromPath(propertyName, culture: collectionView.Culture);
if (forcedDirection != null && newSort.Direction != forcedDirection)
{
newSort = newSort.SwitchSortDirection();
}
owningGrid.DataConnection.SortDescriptions.Add(newSort); owningGrid.DataConnection.SortDescriptions.Add(newSort);
} }

Loading…
Cancel
Save