Это немного сложно и во многом зависит от базового источника данных, но вот что я делаю:
Прежде всего, вам нужен тип данных, который можно сортировать.Для этого я создал «SortableObservableCollection», поскольку моим базовым типом данных является ObservableCollection:
public class SortableObservableCollection<T> : ObservableCollection<T>
{
public event EventHandler Sorted;
public void ApplySort(IEnumerable<T> sortedItems)
{
var sortedItemsList = sortedItems.ToList();
foreach (var item in sortedItemsList)
Move(IndexOf(item), sortedItemsList.IndexOf(item));
if (Sorted != null)
Sorted(this, EventArgs.Empty);
}
}
Теперь, когда в качестве источника данных я могу обнаруживать сортировки в моей DataGrid и обрабатывать фактические данные,Чтобы сделать это, я добавил следующий обработчик события в событие CollectionChanged элементов моей DataGrid:
... In the constructor or initialization somewhere
ItemCollection view = myDataGrid.Items as ItemCollection;
((INotifyCollectionChanged)view.SortDescriptions).CollectionChanged += MyDataGrid_ItemsCollectionChanged;
...
private void MyDataGrid_ItemsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
// This is how we detect if a sorting event has happend on the grid.
if (e.NewItems != null &&
e.NewItems.Count == 1 &&
(e.NewItems[0] is SortDescription))
{
MyItem[] myItems = new MyItem[MyDataGrid.Items.Count]; // MyItem would by type T of whatever is in the SortableObservableCollection
myDataGrid.Items.CopyTo(myItems, 0);
myDataSource.ApplySort(myItems); // MyDataSource would be the instance of SortableObservableCollection
}
}
Одна из причин, по которой это работает немного лучше, чем использование SortDirection, заключается в выполнении комбинированной сортировки(удерживайте нажатой клавишу shift при сортировке столбцов, и вы поймете, что я имею в виду).