Sort a wpf datagrid programmatically Sort a wpf datagrid programmatically wpf wpf

Sort a wpf datagrid programmatically


voo's solution was not working for me, ItemsSource was null, most likely because it was not directly set, but bound.All other solutions I found here at StackOverflow were dealing with sorting the Model only, but the DataGrid header was not reflecting to the sort.

Here's a proper solution based on the incomplete script here: http://dotnetgui.blogspot.co.uk/2011/02/how-to-properly-sort-on-wpf-datagrid.html

public static void SortDataGrid(DataGrid dataGrid, int columnIndex = 0, ListSortDirection sortDirection = ListSortDirection.Ascending){    var column = dataGrid.Columns[columnIndex];    // Clear current sort descriptions    dataGrid.Items.SortDescriptions.Clear();    // Add the new sort description    dataGrid.Items.SortDescriptions.Add(new SortDescription(column.SortMemberPath, sortDirection));    // Apply sort    foreach (var col in dataGrid.Columns)    {        col.SortDirection = null;    }    column.SortDirection = sortDirection;    // Refresh items to display sort    dataGrid.Items.Refresh();}

In case of your code, it can be used like this:

SortDataGrid(myDataGridEvenements, 0, ListSortDirection.Ascending);

Or by using the default parameter values, simply:

SortDataGrid(myDataGridEvenements);


Get your ItemsSource's DataView and use its Sort property to specify the column you are sorting by:

(yourDataGrid.ItemsSource as DataView).Sort = "NAME_OF_COLUMN";


PerformSort method of the DataGrid is what actually executed on a column's header click. However this method is internal. So if you really want to simulate the click you need to use reflection:

public static void SortColumn(DataGrid dataGrid, int columnIndex){    var performSortMethod = typeof(DataGrid)                            .GetMethod("PerformSort",                                       BindingFlags.Instance | BindingFlags.NonPublic);    performSortMethod?.Invoke(dataGrid, new[] { dataGrid.Columns[columnIndex] });}