3

我正在 WPF 数据网格中实现分组。我想对分组的项目进行排序。例如,datagrid 有四列(empno、name、dept、address)。我正在按部门列分组。当我单击 dept 列标题时,我想对分组的项目进行排序。

这里我使用 ListCollectionView 对后面代码中的项目进行分组。

public  ListCollectionView collection;
collection = new ListCollectionView(obj.empData);

collection.GroupDescriptions.Add(new PropertyGroupDescription("Country"));
dgData.Items.SortDescriptions.Add
          (new System.ComponentModel.SortDescription
                   ("Country"
                    ,System.ComponentModel.ListSortDirection.Descending
                   )
           );
dgData.Items.SortDescriptions.Add
          (new System.ComponentModel.SortDescription
                    ("Contact"
                     , System.ComponentModel.ListSortDirection.Descending
                    )
          );
dgData.ItemsSource = collection;

private void dgData_Sorting
        (object sender, Microsoft.Windows.Controls.DataGridSortingEventArgs e)
{
    if (e.Column.SortDirection.ToString() == "Ascending")
    {
        //dgData.Items.SortDescriptions.Clear();
        collection.Refresh();
        collection = new ListCollectionView(obj.empData);
        collection.GroupDescriptions.Add(new PropertyGroupDescription("Country"));
        dgData.Items.SortDescriptions.Add
             ( new System.ComponentModel.SortDescription
                  ("Country"
                   , System.ComponentModel.ListSortDirection.Descending
                  )
              );
         dgData.ItemsSource = collection;
    }
}

更改排序顺序后,它不会反映在 UI 中。请让我知道实现这一点的正确方法。

4

3 回答 3

3

您是否看过 MSDN 文章How to: Sort a GridView Column When a Header Is Clicked,它指的是ListView That Sorts Data Sample中的示例,后者具有(下载示例)链接

有趣的是,对示例下载的最终引用只能通过 MSDN 文章的 .NET 3.0 和 3.5 版本获得,但不能通过 .NET 4.0 和 4.5 的版本获得,尽管代码片段是相同的。

还有一些基于上述 MSDN 示例的沼泽文章:

还有可运行的 Visual Studio 项目的 MSDN 博客文章(依赖于 WPF 工具包):

于 2013-04-17T08:10:30.700 回答
1

您可以使用此代码(限制:在“联系人”上排序时,“国家”顺序将重置为升序):

void dgData_Sorting(object sender, DataGridSortingEventArgs e)
{
    // reset sortings
    collection.SortDescriptions.Clear();

    // define column sort
    e.Column.SortDirection = e.Column.SortDirection 
          == ListSortDirection.Ascending 
             ? ListSortDirection.Descending : ListSortDirection.Ascending;

    // sort collection
    collection.SortDescriptions.Add
             (new SortDescription
                   (e.Column.SortMemberPath
                    , e.Column.SortDirection.GetValueOrDefault()
                   )
              );

    // mark event as handled otherwise the datagrid will "reset" your custom sorting
    e.Handled = true;
}
于 2013-04-17T12:28:04.077 回答
0

I found that turning on Live Sorting makes the second sort column actually take affect, e.g:

collection.IsLiveSortingRequested = true;
collection.LiveSortingProperties.Clear();
collection.LiveSortingProperties.Add("Contact");
于 2016-02-03T23:35:57.097 回答