在 WPF 中对 DataGrid 进行预排序
Posted
技术标签:
【中文标题】在 WPF 中对 DataGrid 进行预排序【英文标题】:Pre-sorting a DataGrid in WPF 【发布时间】:2010-12-10 06:34:28 【问题描述】:我在 WPF 应用程序中有一个DataGrid
,其中包含多个列,包括一个名称列。如果用户切换到特定视图,我希望数据按名称预先排序(并且我希望排序箭头出现在名称标题中,就像用户单击该标题一样)。但是,我找不到实现这一点的预期属性。我正在寻找类似SortColumn
、SortColumnIndex
、SortDirection
等的东西。
是否可以在标记 (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"
。
我必须使用 我知道这是一篇旧帖子,但除了 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 进行预排序的主要内容,如果未能解决你的问题,请参考以下文章