32

有没有办法以编程方式对 WPF DataGrid 进行排序(例如,如果我单击了我的第一列)?

有没有办法模拟这种点击?

这是我的代码:

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

我不知道为什么,但是该行dv.Sort = "strEvtType";导致了一个奇怪的事情,我的窗口出现并且程序没有继续执行下一行,但是,我没有看到排序!

4

6 回答 6

45

voo 的解决方案对我不起作用,ItemsSource为空,很可能是因为它不是直接设置的,而是绑定的。我在 StackOverflow 找到的所有其他解决方案都只处理模型排序,但DataGrid标题没有反映排序。

这是基于此处不完整脚本的正确解决方案: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();
}

对于您的代码,可以这样使用:

SortDataGrid(myDataGridEvenements, 0, ListSortDirection.Ascending);

或者通过使用默认参数值,只需:

SortDataGrid(myDataGridEvenements);
于 2013-11-13T11:13:50.917 回答
6

获取您的 ItemsSource 的 DataView 并使用它的 Sort 属性来指定您要排序的列:

(yourDataGrid.ItemsSource as DataView).Sort = "NAME_OF_COLUMN";
于 2013-06-06T07:49:21.777 回答
4

快速简便的方法:

dgv.Items.SortDescriptions.Clear();
dgv.Items.SortDescriptions.Add(new SortDescription("ID", ListSortDirection.Descending));
dgv.Items.Refresh();
于 2019-10-03T06:51:15.060 回答
3

DataGrid 的PerformSort方法是在单击列标题时实际执行的。然而,这种方法是内部的。所以如果你真的想模拟点击你需要使用反射:

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] });
}
于 2017-08-07T14:46:51.740 回答
3

我的方法对我有用。试试这个代码。对不起俄语

// Если таблица пустая, то привязываем ее к журналу 
            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();
于 2016-11-03T06:20:53.757 回答
0

您可以使用ICollectionView在数据网格中过滤、排序和分组您的项目。

编辑:添加排序,没有仔细阅读问题:)

 var view = CollectionViewSource.GetDefaultView(this.MyData);
 view.Filter = ViewFilter;
 view.SortDescriptions.Add(new SortDescription("MyPropertyToSort", ListSortDirection.Descending));


    private bool ViewFilter(object obj)
    {
        var item = obj as MyObject;

        if (item == null)
            return false;

        //your filter logik goes here

        if(item.MyStringProp.StartsWith("Test"))
            return false;

        return true;


   }
于 2013-06-06T07:55:22.140 回答