我正在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中反映出来。请让我知道实现此目的的正确方法。
答案 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");