Как настроить мой файл WPF для сортировки по нескольким столбцам, похожим на наличие двух сортируемых столбцов, щелкая по заголовку первого столбца для первичной сортировки, а затем SHIFT, нажимая на заголовок второго столбца для вторичной сортировки, Я хотел бы, чтобы сортировка нескольких столбцов происходила автоматически, когда пользователь нажимает на заголовок первого столбца, не имея SHIFT, нажмите на второй заголовок столбца. Есть ли способ сделать это полностью в xaml? Если нет, то как я могу сделать это в коде? В настоящее время используется VB.Net, но фрагмент С# является приемлемым, если он у вас есть. Спасибо!
Сортировка по нескольким столбцам в WPat datagrid
Ответ 1
Вы можете сделать это, добавив пространство имен System.ComponentModel, как это:
xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
затем внутри CollectionViewSource добавьте новый Сортировка:
<CollectionViewSource … >
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="Column1"/>
<scm:SortDescription PropertyName="Column2"/>
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
это будет сортировать datagrid для столбца1, column2.
Edit:
также делает это, используя код С# позади довольно легко:
private void btnSort_Click(object sender, RoutedEventArgs e)
{
System.Windows.Data.CollectionViewSource myViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("The_ViewSource_Name")));
myViewSource.SortDescriptions.Add(new SortDescription("Column1", ListSortDirection.Ascending));
myViewSource.SortDescriptions.Add(new SortDescription("Column2", ListSortDirection.Ascending));
}
Edit2:
Временное решение может быть сделано, чтобы поймать заголовок левой кнопкой мыши заголовка столбца и предотвратить сортировку сетки в этом столбце следующим образом:
- Отключить свойство сетки с именем CanUserSortColumns
-
Добавьте этот код в сетку Событие PreviewMouseLeftButtonUp:
private void myDataGrid_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e) { DependencyObject dep = (DependencyObject)e.OriginalSource; while ((dep != null) && !(dep is DataGridCell) && !(dep is DataGridColumnHeader)) { dep = VisualTreeHelper.GetParent(dep); } if (dep == null) return; if (dep is DataGridColumnHeader) { DataGridColumnHeader columnHeader = dep as DataGridColumnHeader; // check if this is the wanted column if (columnHeader.Column.Header.ToString() == "The_Wanted_Column_Title") { System.Windows.Data.CollectionViewSource myViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("myViewSource"))); myViewSource.SortDescriptions.Clear(); myViewSource.SortDescriptions.Add(new SortDescription("Column1", ListSortDirection.Ascending)); myViewSource.SortDescriptions.Add(new SortDescription("Column2", ListSortDirection.Ascending)); } else { //usort the grid on clicking on any other columns, or maybe do another sort combination System.Windows.Data.CollectionViewSource myViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("myViewSource"))); myViewSource.SortDescriptions.Clear(); } } }
Вы можете изменить и развернуть этот код для достижения своих требований.
Ответ 2
Надеюсь, это поможет другим. Мое решение поддерживает функцию сортировки по умолчанию и позволяет сортировать по нескольким столбцам.
Поместите событие сортировки на ваш datagrid
<DataGrid x:Name="dataGridName" Sorting="dataGridName_Sorting">
И теперь в вашем коде
private void dataGridName_Sorting(object sender, DataGridSortingEventArgs e)
{
var dgSender = (DataGrid) sender;
var cView = CollectionViewSource.GetDefaultView(dgSender.ItemsSource);
//Alternate between ascending/descending if the same column is clicked
ListSortDirection direction = ListSortDirection.Ascending;
if (cView.SortDescriptions.FirstOrDefault().PropertyName == e.Column.SortMemberPath)
direction = cView.SortDescriptions.FirstOrDefault().Direction == ListSortDirection.Descending ? ListSortDirection.Ascending : ListSortDirection.Descending;
cView.SortDescriptions.Clear();
AddSortColumn((DataGrid)sender, e.Column.SortMemberPath, direction);
//To this point the default sort functionality is implemented
//Now check the wanted columns and add multiple sort
if (e.Column.SortMemberPath == "WantedColumn")
{
AddSortColumn((DataGrid)sender, "SecondColumn", direction);
}
e.Handled = true;
}
private void AddSortColumn(DataGrid sender, string sortColumn, ListSortDirection direction)
{
var cView = CollectionViewSource.GetDefaultView(sender.ItemsSource);
cView.SortDescriptions.Add(new SortDescription(sortColumn, direction));
//Add the sort arrow on the DataGridColumn
foreach (var col in sender.Columns.Where(x => x.SortMemberPath == sortColumn))
{
col.SortDirection = direction;
}
}
Функция sortDirection на DataGridColumn позволяет показывать стрелку на сетке.