Skip to content

Commit

Permalink
reset sort index when columns change
Browse files Browse the repository at this point in the history
  • Loading branch information
Edward Miller committed Dec 27, 2023
1 parent 6497ae7 commit 15a678e
Showing 1 changed file with 46 additions and 13 deletions.
59 changes: 46 additions & 13 deletions Maui.DataGrid/DataGrid.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -986,23 +986,19 @@ protected override void OnBindingContextChanged()

private void OnColumnsChanged(object? sender, NotifyCollectionChangedEventArgs e)
{
if (e.OldItems != null)
var newSortedColumnIndex = RegenerateSortedColumnIndex(e);

if (newSortedColumnIndex != SortedColumnIndex)
{
foreach (DataGridColumn oldColumn in e.OldItems)
{
oldColumn.SizeChanged -= OnColumnSizeChanged;
}
}
// This will do a SortAndPaginate via the propertyChanged event of the SortedColumnIndexProperty
SortedColumnIndex = newSortedColumnIndex;

if (e.NewItems != null)
InitHeaderView();
}
else
{
foreach (DataGridColumn newColumn in e.NewItems)
{
newColumn.SizeChanged += OnColumnSizeChanged;
}
Reload();
}

Reload();
}

private void OnColumnSizeChanged(object? sender, EventArgs e) => Reload();
Expand All @@ -1016,6 +1012,43 @@ private void OnSelectionChanged(object? sender, SelectionChangedEventArgs e)
_itemSelectedEventManager.HandleEvent(this, e, nameof(ItemSelected));
}

private SortData? RegenerateSortedColumnIndex(NotifyCollectionChangedEventArgs e)
{
var oldColumns = e.OldItems?.Cast<DataGridColumn>().ToList();
var newColumns = e.NewItems?.Cast<DataGridColumn>().ToList();

oldColumns?.ForEach(oldColumn => oldColumn.SizeChanged -= OnColumnSizeChanged);
newColumns?.ForEach(newColumn => newColumn.SizeChanged += OnColumnSizeChanged);

DataGridColumn? oldSortedColumn = null;

if (oldColumns != null && SortedColumnIndex != null)
{
oldSortedColumn = oldColumns[SortedColumnIndex.Index];
}

int? newSortedColumnIndex = null;

if (newColumns != null && oldSortedColumn != null)
{
newSortedColumnIndex = newColumns.IndexOf(oldSortedColumn);
}

if (oldSortedColumn != null && SortedColumnIndex != null)
{
if (newSortedColumnIndex == null)
{
return null;
}
else
{
return new(newSortedColumnIndex.Value, SortedColumnIndex.Order);
}
}

return SortedColumnIndex;
}

internal void Reload()
{
InitHeaderView();
Expand Down

0 comments on commit 15a678e

Please sign in to comment.