Sort a wpf datagrid programmatically

51,728

Solution 1

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);

Solution 2

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";

Solution 3

Fast & Easy way:

dgv.Items.SortDescriptions.Clear();
dgv.Items.SortDescriptions.Add(new SortDescription("ID", ListSortDirection.Descending));
dgv.Items.Refresh();

Solution 4

My method is work for me. Just try this code. Sorry for Russian

// Если таблица пустая, то привязываем ее к журналу 
            if(dgEvents.ItemsSource == null)
                dgEvents.ItemsSource = events.Entries;
            // Обновляем записи
            CollectionViewSource.GetDefaultView(dgEvents.ItemsSource).Refresh();
            // Очищаем описание сортировки
            dgEvents.Items.SortDescriptions.Clear();
            // Созадем описание сортировки
            dgEvents.Items.SortDescriptions.Add(new SortDescription(dgEvents.Columns[0].SortMemberPath, ListSortDirection.Descending));

            // Очищаем сортировку всех столбцов
            foreach (var col in dgEvents.Columns)
            {
                col.SortDirection = null;
            }
            // Задаем сортировку времени по убыванию (последняя запись вверху)
            dgEvents.Columns[0].SortDirection = ListSortDirection.Descending;
            // Обновляем записи
            dgEvents.Items.Refresh();

Solution 5

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] });
}
Share:
51,728
Walter Fabio Simoni
Author by

Walter Fabio Simoni

Updated on August 02, 2021

Comments

  • Walter Fabio Simoni
    Walter Fabio Simoni almost 3 years

    Is there a way to sort a WPF DataGrid programmatically (for example, like if I clicked on my first column)?

    Is there a way to simulate this click?

    Here is my code:

    Collection_Evenements = new ObservableCollection<Evenement>();
     
    Collection_Evenements = myEvenement.GetEvenementsForCliCode(App.obj_myClient.m_strCode);
    Collection_Evenements.CollectionChanged += Collection_Evenements_CollectionChanged;
    myDataGridEvenements.ItemsSource = Collection_Evenements;
     
    System.Data.DataView dv = (System.Data.DataView)myDataGridEvenements.ItemsSource;
    dv.Sort = "strEvtType";
                
    myDataGridEvenements.Focus();
    myDataGridEvenements.SelectedIndex = 0;
    myDataGridEvenements.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
    

    I don't know why, but the line dv.Sort = "strEvtType"; causes a strange thing, my Window shows up and the program doesn't continue to execute the next lines, nevertheless, I don't see the sort!