Кажется, что вы не можете сделать это без незначительного вмешательства в сортировочных обработчиков, потому что по умолчанию сортировка производится 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
к своей модели, если логика для определения этого есть.
Я тоже пришел к этому решению, он отлично работает. Жаль, что я не могу указать его в XAML, где я делаю свою привязку, поскольку это сложно из события сортировки, чтобы вернуться к базовым связанным данным, чтобы определить, нужно ли это делать, если вам нужно, чтобы он работал именно так некоторые столбцы. – DannyMeister
@ DannyMeister Я обновил свой ответ с помощью вспомогательного свойства, которое позволит вам сделать это полностью в xaml. – Evk
Это обновление действительно очень полезный ответ! – DannyMeister