我有这样的代码:
StatusItems = new ObservableCollection<StatusItem> { };
StatusItemsGrouped = new ListCollectionView(StatusItems);
StatusItemsGrouped.GroupDescriptions.Add(new PropertyGroupDescription("GenericStatus"));
StatusItemsGrouped.SortDescriptions.Add(new SortDescription("GenericStatus", ListSortDirection.Descending));
基本上,我根据名为 GenericStatus
的信息对 DataGrid
上的数据进行分组。除了排序,一切都很好。我现在想要实现的是按降序对组进行排序(正如我的代码所做的那样),但是上面代码的问题是,一旦用户单击某个列,排序就会被破坏。
我想保留群组排序,但仍允许用户排序。我猜用户排序基本上是次要排序,即我想要这样:ORDER BY GenericStatus DESC, UsersColumnOfChoise ASC/DESC
。
最佳答案
我自己刚遇到这个问题,我的解决方案是拦截 Sorting 事件,让 ICollectionView 在 ViewModel 中进行排序,而不是依赖 DataGrid 来处理它。
XAML:
<DataGrid ItemsSource="{Binding StatusItemsGrouped}" Sorting="OnSorting_"/>
XAML.CS:
private void OnSorting_(object sender, DataGridSortingEventArgs e)
{
var viewModel = DataContext as ViewModel;
e.Handled = true; // prevent DataGrid from sorting
viewModel.SortItemSource(e.Column); // perform sorting
e.Column.SortDirection = viewModel.SortDirection; // set sort direction icon on column header
}
View 模型:
public class ViewModel
{
public ListCollectionView StatusItemsGrouped { get; set; }
public ListSortDirection SortDirection { get; set; }
public string SortColumn { get; set; }
public void SortItemSource(string columnName)
{
if (String.Compare(SortColumn, columnName, true) == 0)
SortDirection = ListSortDirection.Ascending;
else
SortDirection = ListSortDirection.Descending;
SortColumn = columnName;
using(StatusItemsGrouped.DeferRefresh()) {
StatusItemsGrouped.GroupDescriptions.Clear();
StatusItemsGrouped.SortDescriptions.Clear();
StatusItemsGrouped.SortDescriptions.Add(new SortDescription(SortColumn, SortDirection));
StatusItemsGrouped.GroupDescriptions.Add(new PropertyGroupDescription("GenericStatus"));
}
StatusItemsGrouped.Refresh();
}
}
关于c# - 如何在 WPF 中强制 DataGrid 组顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10353535/