我找到了另一个有帮助的线程。您可以使用 DataGrid.Sorting 事件来覆盖此处提到的默认排序。该答案表示他或她会覆盖 DataGrid,但您不必这样做。它还假设您已使用 IList 作为数据源,因此这里有一个示例,而是假设 DataTable/DataView (IBindingList) 源:
private void dgPeople_Sorting(object sender, DataGridSortingEventArgs e)
{
//Assumes you've named your column colFullName in XAML
if (e.Column == colFullName)
{
ListSortDirection direction = (e.Column.SortDirection != ListSortDirection.Ascending) ? ListSortDirection.Ascending : ListSortDirection.Descending;
//set the sort order on the column
e.Column.SortDirection = direction;
//Prevent the default sorting
e.Handled = true;
//Get the static default view that the grid is bound to to redefine its sorting
BindingListCollectionView cv = (BindingListCollectionView)CollectionViewSource.GetDefaultView(dgPeople.ItemsSource);
cv.SortDescriptions.Clear();
cv.SortDescriptions.Add(new SortDescription("FirstName", direction));
cv.SortDescriptions.Add(new SortDescription("LastName", direction));
cv.Refresh();
}
}
我发现您需要对 ICollectionView(本示例中的 BindingListCollectionView)而不是 DataView 执行排序的困难方法。如果不这样做,您在 DataView 上执行的排序将被 ICollectionView 上的排序集覆盖。
我发现这个链接很有帮助:http: //msdn.microsoft.com/en-us/library/ms752347.aspx#what_are_collection_views