2016-05-20 7 views
1

У меня есть DataGrid WPF с сортируемыми столбцами. Я не хочу предварительно сортировать сетку в любом конкретном столбце. Я просто хочу направление сортировки по умолчанию, когда пользователь сначала нажимает на заголовок столбца, чтобы спускаться, а не подниматься.Как установить направление сортировки по умолчанию на убывание для столбца WPF DataGrid?

Ни при сортировке, ни в сортировке. Директива на CollectionViewSource и свойство SortDirection объекта DataGridTextColumns влияет на направление сортировки по умолчанию при изменении столбца сортировки. Он всегда выбирает восхождение по первому щелчку заголовка столбца.

99% времени, в течение которого он должен опускаться, и переключения столбцов в пользовательский рабочий процесс часто, поэтому это добавляет много ненужных кликов. Я бы предпочел решение XAML, если оно есть, но при необходимости прибегнет к обману кода.

ответ

1

Кажется, что вы не можете сделать это без незначительного вмешательства в сортировочных обработчиков, потому что по умолчанию сортировка производится DataGrid начинается так:

ListSortDirection direction = ListSortDirection.Ascending; 
ListSortDirection? sortDirection = column.SortDirection; 
if (sortDirection.HasValue && sortDirection.Value == ListSortDirection.Ascending) 
    direction = ListSortDirection.Descending; 

Таким образом, только если столбец был отсортирован раньше, и что-то было Восходящий - это будет переверните его на нисходящий. Однако с крошечным взломом вы можете достичь того, чего хотите. Во-первых подписаться на DataGrid.Sorting событие, и там:

private void OnSorting(object sender, DataGridSortingEventArgs e) { 
    if (e.Column.SortDirection == null) 
     e.Column.SortDirection = ListSortDirection.Ascending; 
    e.Handled = false; 
} 

Так в основном, если не было своего рода еще - вы включите его в Ascending и передать его по умолчанию сортировки DataGrid (установив e.Handled в false). В начале сортировки он перевернет это до Descending для вас, и это то, что вы хотите.

Вы можете сделать это в XAML с помощью вложенного свойства, например:

public static class DataGridExtensions {   
    public static readonly DependencyProperty SortDescProperty = DependencyProperty.RegisterAttached(
     "SortDesc", typeof (bool), typeof (DataGridExtensions), new PropertyMetadata(false, OnSortDescChanged)); 

    private static void OnSortDescChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { 
     var grid = d as DataGrid; 
     if (grid != null) { 
      grid.Sorting += (source, args) => { 
       if (args.Column.SortDirection == null) { 
        // here we check an attached property value of target column 
        var sortDesc = (bool) args.Column.GetValue(DataGridExtensions.SortDescProperty); 
        if (sortDesc) { 
         args.Column.SortDirection = ListSortDirection.Ascending; 
        } 
       } 
      }; 
     } 
    } 

    public static void SetSortDesc(DependencyObject element, bool value) { 
     element.SetValue(SortDescProperty, value); 
    } 

    public static bool GetSortDesc(DependencyObject element) { 
     return (bool) element.GetValue(SortDescProperty); 
    } 
} 

Затем в XAML:

<DataGrid x:Name="dg" AutoGenerateColumns="False" ItemsSource="{Binding Items}" local:DataGridExtensions.SortDesc="True"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Binding="{Binding Value}" 
          Header="Value" 
          local:DataGridExtensions.SortDesc="True" /> 
    </DataGrid.Columns> 
</DataGrid> 

Так в основном вы отмечаете DataGrid себя SortDesc=true, чтобы подписаться для сортировки события, а затем вы отметьте только, что колонки нужно сортировать по убыванию. Вы также можете привязать SortDesc к своей модели, если логика для определения этого есть.

+0

Я тоже пришел к этому решению, он отлично работает. Жаль, что я не могу указать его в XAML, где я делаю свою привязку, поскольку это сложно из события сортировки, чтобы вернуться к базовым связанным данным, чтобы определить, нужно ли это делать, если вам нужно, чтобы он работал именно так некоторые столбцы. – DannyMeister

+0

@ DannyMeister Я обновил свой ответ с помощью вспомогательного свойства, которое позволит вам сделать это полностью в xaml. – Evk

+0

Это обновление действительно очень полезный ответ! – DannyMeister