看來你不能這樣做沒有輕微的干預分揀處理程序,因爲默認的排序由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
並把它傳遞到默認(通過設置e.Handled
到false
)的DataGrid
排序。在排序開始時,它會將你的內容翻轉到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
,認購排序事件,然後你只標記你需要排序的列desc。您也可以將SortDesc
綁定到您的模型,如果邏輯來確定這是否存在。
來源
2016-05-20 21:52:35
Evk
我也來過這個解決方案,它工作正常。太糟糕了,我無法在XAML中指定它,因爲從排序事件中很難處理返回到底層綁定數據,以確定如果您需要以這種方式工作某些欄目。 – DannyMeister
@DannyMeister我已經用助手附加屬性更新了我的答案,這將允許您完全在xaml中完成此操作。 – Evk
這個更新使得這個確實非常有用! – DannyMeister