在 Silverlight DataGrid 中设置初始排序顺序?

Posted

技术标签:

【中文标题】在 Silverlight DataGrid 中设置初始排序顺序?【英文标题】:set initial sort order in Silverlight DataGrid? 【发布时间】:2010-09-18 14:13:36 【问题描述】:

当我第一次将数据加载到 Silverlight DataGrid 控件时,如何使屏幕看起来就像用户刚刚单击了第一列的标题一样?换句话说,数据应该根据该列的值按升序排序,并且小排序箭头应该显示在第一列的标题中。

假设这是可能的,我是否也可以让它看起来好像用户单击了第一列然后按住 shift 单击了第二列?换句话说,我能否以编程方式应用两部分排序并让屏幕看起来好像用户已经完成了它?

【问题讨论】:

【参考方案1】:

我也需要这样做,并且深入研究 DataGrid 是否可以做到这一点。

实际上在 DataGridColumnHeader 类上有一个适当的方法,即 InvokeProcessSort,但它是内部的,在 DataGrid 类的其他任何地方都没有出现。

我所能做的就是在绑定数据之前对其进行预排序。我正在使用实现 ICollectionView 以及 ObservableCollection 的自定义数据集合,这可以正常工作 - 但它不是最佳的,并且不一定需要大量工作。

此外,提供预先排序的集合意味着网格不显示排序标记。

我将在 DataGrid 错误跟踪器上将此作为一个问题提出 - 这是一个相当大的遗漏,很容易修复 - MS 只需要在 DataGridColumn 和 DataGrid 类上公开适当的方法。

【讨论】:

【参考方案2】:

这是我的解决方案:

if (pcv.CanSort == true)

      pcv.SortDescriptions.Add(new SortDescription("ProductionStatus", ListSortDirection.Ascending));
      pcv.SortDescriptions.Add(new SortDescription("Date", ListSortDirection.Descending));

,其中 pcv 是 PageCollectionView。这首先按 ProductionStatus 属性排序,然后按 日期属性。它只显示第二列的小排序箭头。

【讨论】:

我认为这是从 Silverlight 4 中删除的 谢谢。也为我使用 SL4。【参考方案3】:

发现 Paul Sherrif 的一篇不错的小文章为我们解决了这个问题...

http://weblogs.asp.net/psheriff/archive/2010/07/14/use-collectionviewsource-in-silverlight.aspx

基本上我们还是将 DataGrid 绑定到 CollectionViewSource。原来这有一个 CollectionViewSource.SortDescriptions 配置集,可以让我们指定默认排序顺序。

谢谢保罗!

【讨论】:

【参考方案4】:

只需向 DomainDataSource 添加一个 SortDescriptor:

<riaControls:DomainDataSource.SortDescriptors>
    <riaControls:SortDescriptor PropertyPath="ColumnName" Direction="Descending" />
</riaControls:DomainDataSource.SortDescriptors>

【讨论】:

【参考方案5】:

Silverlight 3+ 中存在 CollectionViewSource

http://msdn.microsoft.com/en-us/library/system.windows.data.collectionviewsource(v=vs.95).aspx

按照 Microsoft 的建议,有一种在 XAML 中定义默认排序顺序的简单方法:

使用 CollectionViewSource 在标记中声明排序

 <Window.Resources>
   <app:MyData x:Key="MyData"/>
   <CollectionViewSource x:Key="cvs" Source=StaticResource MyData>
     <CollectionViewSource.SortDescriptions>
        <SortDescription Property="Name"/>
     </CollectionViewSource.SortDescriptions>
   </CollectionViewSource>
 </Window.Resources>

 <DataGrid ItemsSource="Binding Source=StaticResource cvs"/> 

在https://connect.microsoft.com/VisualStudio/feedback/details/678782/set-default-sort-order-of-datagrid的cmets找到

我对微软样本的修正:

 <sort:SortDescription 
   PropertyName="Name"
   Direction="Ascending"
   xmlns:sort="clr-namespace:System.ComponentModel;assembly=System.Windows"
   /> 

【讨论】:

以上是关于在 Silverlight DataGrid 中设置初始排序顺序?的主要内容,如果未能解决你的问题,请参考以下文章

在 Silverlight 中刷新 DataGrid

在 Silverlight 中更改 Datagrid Header 的背景颜色

WPF DataGrid 样式-Silverlight DataGrid?

DataGrid和Silverlight

Silverlight 2 DataGrid December 2008

Silverlight 利用DataGrid行加载事件动态控制行列显示