Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WPF Datagrid: Clear column sorting

I am using a WPF Datagrid in my application where columns can be sorted by clicking on the header.

I was wondering if there was any way to clear a column's sorting programatically ?

I tried sorting a column and then clearing MyDataGrid.Items.SortDescriptions, but that collection was empty (even though one column was sorted).

I also tried :

MyDataGridColumn.SortDirection = null;

The problem is that the column indication is gone, but the sorting still occurs when editing a cell and switching rows.

Is there no way to clear a column's sort ?

Edit (for clarity): The problem is that I'd like to allow sorting again if the user re-clicks on the same column header, so setting CanUserSort to false would be problematic, even if it were done in the XAML. In short, what I'm attempting to do, is prevent rows from being ordered once a sorted column has a cell that was modified. I want to force the user to re-click on the header.

like image 982
Hussein Khalil Avatar asked Nov 15 '12 16:11

Hussein Khalil


3 Answers

Here is what you need:

using System.Windows.Data;
using System.ComponentModel;

ICollectionView view = CollectionViewSource.GetDefaultView(grid.ItemsSource);
if (view != null)
{
    view.SortDescriptions.Clear();
    foreach (DataGridColumn column in grid.Columns)
    {
        column.SortDirection = null;
    }
}

Original source: https://stackoverflow.com/a/9533076/964053

What I want to know is what was M$ thinking for not putting a ClearSort() method...

like image 160
NoOne Avatar answered Nov 17 '22 18:11

NoOne


as an extension...

    public static  void ClearSort(this DataGrid grid)
    {
        var view = CollectionViewSource.GetDefaultView(grid.ItemsSource);
        view?.SortDescriptions.Clear();

        foreach (var column in grid.Columns)
        {
            column.SortDirection = null;
        }
    }
like image 5
Chris Avatar answered Nov 17 '22 20:11

Chris


Set CanUserSort to false for all columns -

foreach (var a in MyDataGrid.Columns)
{
    a.CanUserSort = false;
}
like image 4
Rohit Vats Avatar answered Nov 17 '22 20:11

Rohit Vats