WPF数据网格按所选列自动排序
本文关键字:排序 数据 数据网 网格 WPF | 更新日期: 2023-09-27 18:27:49
目前我正在开发WPF的数据网格。我遇到了自动排序的问题。这是我的xaml:
<DataGrid x:Name="customTasksDataGrid" Margin="10,10,10,38" Grid.Column="1" IsReadOnly="True" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Binding="{Binding ID}"/>
<DataGridTextColumn Header="Client" Binding="{Binding Client.Names}"/>
...
<DataGridTextColumn Header="DueDate" Binding="{Binding DueDate, StringFormat='{0:dd.MM.yy HH:mm'}}" SortDirection="Ascending">
<DataGridTextColumn.ElementStyle>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Foreground" Value="{Binding Path=., Converter={StaticResource converter}}"/>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
...
</DataGrid.Columns>
问题是:当我更新数据网格的ItemsSource时,数据网格按ID
列排序,而不是按DueDate
列排序。当对我的数据网格执行任何更新操作时,如何通过DueDate
实现自动排序?
我尝试使用PropertyChanged.Fody
中的:[ImplementPropertyChanged]
标记,并将其放在CustomTask
类之前,但这种方法根本不起作用(甚至不知道是否需要它)。
编辑:
可以使用
customTasksDataGrid.ItemsSource = model;
customTasksDataGrid.Items.SortDescriptions.Add(new SortDescription("DueDate", ListSortDirection.Ascending));
您可以简单地在Code-Behind:中对数据网格进行排序
datagrid.Items.SortDescriptions.Add(new SortDescription("DueDate", ListSortDirection.Ascending));
或使用xaml扩展:
<UserControl xmlns:e="clr-namespace:Xaml.Extensions">
<DataGrid e:DataGridExtensions.DefaultSorting="A:Date">
<DataGrid e:DataGridExtensions.DefaultSorting="D:Time">
</UserControl>
using System;
using System.Windows;
using System.Windows.Controls;
using System.ComponentModel;
#nullable enable
namespace Xaml.Extensions
{
public static class DataGridExtensions
{
#region DefaultSorting
public static readonly DependencyProperty DefaultSortingProperty =
DependencyProperty.RegisterAttached(
nameof(DefaultSortingProperty).Replace("Property", string.Empty),
typeof(string),
typeof(DataGridExtensions),
new PropertyMetadata(string.Empty, OnDefaultSortingChanged));
public static string? GetDefaultSorting(DependencyObject element)
{
return (string?)element.GetValue(DefaultSortingProperty);
}
public static void SetDefaultSorting(DependencyObject element, string? value)
{
element.SetValue(DefaultSortingProperty, value);
}
private static void OnDefaultSortingChanged(
DependencyObject element,
DependencyPropertyChangedEventArgs args)
{
if (element is not DataGrid dataGrid)
{
throw new ArgumentException("Element should be DataGrid.");
}
if (args.NewValue is not string sorting)
{
throw new ArgumentException("Type should be string.");
}
var values = sorting.Split(':');
if (values.Length != 2)
{
throw new InvalidOperationException("String should be like 'A:Name' or 'D:Name'.");
}
dataGrid.Items.SortDescriptions.Clear();
dataGrid.Items.SortDescriptions.Add(
new SortDescription(
values[1],
values[0] == "D"
? ListSortDirection.Descending
: ListSortDirection.Ascending));
}
#endregion
}
}
如果您指定了DesignInstance
,这也可以在设计器中实时工作。