WPF Datagrid组和排序

时间:2013-04-17 02:04:30

标签: c# wpf sorting data-binding collections

我正在WPF数据网格中实现分组。我想对分组的项目进行排序。 例如,datagrid有四列(empno,name,dept,address)。我正在按照dept专栏进行分组。 当我点击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中反映出来。请让我知道实现此目的的正确方法。

3 个答案:

答案 0 :(得分:2)

您是否看过MSDN文章How to: Sort a GridView Column When a Header Is Clicked,该文章引用了ListView That Sorts Data Sample中的示例,后者有Download sample)链接

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

还有基于以上MSDN样本的样本的沼泽文章:

还有MSDN博客文章,其中包含可运行的Visual Studio项目(在WPF Toolkit上具有相关性):

答案 1 :(得分: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;
}

答案 2 :(得分:0)

我发现启用实时排序会使第二个排列实际生效,例如:

collection.IsLiveSortingRequested = true;
collection.LiveSortingProperties.Clear();
collection.LiveSortingProperties.Add("Contact");