在 WPF 中对 DataGrid 进行预排序

Posted

技术标签:

【中文标题】在 WPF 中对 DataGrid 进行预排序【英文标题】:Pre-sorting a DataGrid in WPF 【发布时间】:2010-12-10 06:34:28 【问题描述】:

我在 WPF 应用程序中有一个DataGrid,其中包含多个列,包括一个名称列。如果用户切换到特定视图,我希望数据按名称预先排序(并且我希望排序箭头出现在名称标题中,就像用户单击该标题一样)。但是,我找不到实现这一点的预期属性。我正在寻找类似SortColumnSortColumnIndexSortDirection 等的东西。

是否可以在标记 (XAML) 中指定默认的排序列和方向,或者 WPF 工具包 DataGrid 不支持?

【问题讨论】:

由于 WPF 没有内置 DataGrid,我们可以假设您指的是 WPF Toolkit 附带的 DataGrid (codeplex.com/wpf)??? 是的,我放了 wpftoolkit 标签,但我想我的问题中没有提到它。我会补充的。 【参考方案1】:

假设您正在讨论 WPF Toolkit DataGrid 控件,您只需将 the CanUserSortColumns property 设置为 true,然后将 DataGrid 中每个 DataGridColumn 的 the SortMemberPath property 设置为。

至于最初对集合进行排序,您必须使用 CollectionViewSource 并在其上设置排序,然后将其分配为 DataGrid 的 ItemsSource。如果您在 XAML 中执行此操作,那么它会很简单:

<Window.Resources>
    <CollectionViewSource x:Key="MyItemsViewSource" Source="Binding MyItems">
        <CollectionViewSource.SortDescriptions>
           <scm:SortDescription PropertyName="MyPropertyName"/>
        </CollectionViewSource.SortDescriptions>
    </CollectionViewSource>
</Window.Resources>

<DataGrid ItemsSource="StaticResource MyItemsViewSource">

</DataGrid>

注意:“scm”命名空间前缀映射到 SortDescription 类所在的 System.ComponentModel。

xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"

编辑:我认为有足够多的人从这篇文章中得到了帮助,这个被赞成的评论应该包含在这个答案中:

我必须用它来让它工作:

<DataGrid ItemsSource="Binding Source=StaticResource MyItemsViewSource">

【讨论】:

@Drew,谢谢,但 SortMemberPath 只是指定数据源中的哪个字段与 DataGrid 中的哪个列对应。我需要设置 current 排序列(和方向)。例如,此 DataGrid 当前按名称升序排序。 那么您如何解决“单击标题列和排序问题”。我不小心遗漏了如何最初对网格进行排序,我现在将添加到我的答案中。 是的 :) 这更接近我想要的,谢谢。唯一的问题是排序箭头没有出现在表格排序依据的列的标题中。我可以忍受,但箭头会让用户更清楚排序列是什么。对于任何尝试这样做的人,请注意,您需要参考WindowsBase 才能使用System.ComponentModel。添加参考后,您需要:xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase" 我必须使用 才能让它工作。【参考方案2】:

我知道这是一篇旧帖子,但除了 Drew Marsh 的回答和回应 DanM 的列标题箭头未出现的问题...您需要将 SortDirection 属性添加到 DataGridColumn:

<DataGridTextColumn Header="Name" Binding="Binding Name" SortDirection="Ascending" />

我发布了一个关于此的问题,并在几天后找到了答案:

ColumnHeader arrows not reflected when sorting a DataGrid in XAML

【讨论】:

这确实意味着SortDirection 属性必须手动匹配SortDescription 中的列 - DataGrid 有什么方法可以检测 CollectionViewSource 的排序并自动显示指标?【参考方案3】:

当您看到 ItemsSource 不支持 CollectionViewSource 异常时,您可以将 DataGrid 的 DataContext 设置为 'MyItemsViewSource' 并将 ItemsSource 设置为 Binding,如下所示:

<DataGrid DataContext="StaticResource MyItemsViewSource" ItemsSource="Binding">
</DataGrid>

【讨论】:

我一直回到这篇文章(今年第三次),因为我忘记了这个非常重要的部分/拼图!感谢您发布它。【参考方案4】:

当您看到 ItemsSource doesn't support CollectionViewSource 异常时,您可以在将集合引用到 DataGrid 之前按 Linq 对集合进行排序:

ObservableCollection<MyDataClass> myCollection = new ObservableCollection<MyDataClass>();
dataGrid.ItemsSource = from item in myCollection orderby item select item;

你必须实现IComparable接口到MyDataClass

public class MyDataClass : IComparable<MyDataClass> 
    public int CompareTo(Classified other) 
        return other.Value.CompareTo(this.Value); // DESC
        return this.Value.CompareTo(other.Value); // ASC
    

【讨论】:

这实际上对我有用,因为我试图使用 Lambda 订购 BindlingList。这行得通,Lambda 没有!【参考方案5】:

这对我有用。

ListSortDirection sortDirection;
int selectedColumnIndex;
private void customerDataGrid_Sorting(object sender, DataGridSortingEventArgs e)

    selectedColumnIndex = e.Column.DisplayIndex;
    sortDirection = (e.Column.SortDirection == ListSortDirection.Ascending ? ListSortDirection.Descending: ListSortDirection.Ascending);


private void applySortDescriptions(ListSortDirection listSortDirection)

    //Clear current sort descriptions 
    customerDataGrid.Items.SortDescriptions.Clear();

    //Get property name to apply sort based on desired column 
    string propertyName = customerDataGrid.Columns[selectedColumnIndex].SortMemberPath;

    //Add the new sort description 
    customerDataGrid.Items.SortDescriptions.Add(new SortDescription(propertyName, listSortDirection));

    //apply sort 
    applySortDirection(listSortDirection);

    //refresh items to display sort 
    customerDataGrid.Items.Refresh();


private void applySortDirection(ListSortDirection listSortDirection)

    customerDataGrid.Columns[selectedColumnIndex].SortDirection = listSortDirection;

【讨论】:

以上是关于在 WPF 中对 DataGrid 进行预排序的主要内容,如果未能解决你的问题,请参考以下文章

在wpf设计的界面中,我通过DataGrid建立列表,我想通过点击列表头进行排序。

WPF4 Datagrid 不对列标题进行排序

WPF中对datagrid删除选中的某一行。

排序时复选框在 WPF Datagrid 中重置

WPF Datagrid对具有空元素的列进行排序

使用 C# 在 WPF 中使 DataGrid 列标题可排序