当我第一次将数据加载到 Silverlight DataGrid 控件时,如何使屏幕看起来就像用户刚刚单击了第一列的标题一样?换句话说,数据应根据该列的值按升序排序,并且小排序箭头应显示在第一列的标题中。
假设这是可能的,我是否也可以让它看起来好像用户单击了第一列然后按 shift 单击了第二列?换句话说,我可以以编程方式应用两部分排序并让屏幕看起来好像用户已经完成了吗?
当我第一次将数据加载到 Silverlight DataGrid 控件时,如何使屏幕看起来就像用户刚刚单击了第一列的标题一样?换句话说,数据应根据该列的值按升序排序,并且小排序箭头应显示在第一列的标题中。
假设这是可能的,我是否也可以让它看起来好像用户单击了第一列然后按 shift 单击了第二列?换句话说,我可以以编程方式应用两部分排序并让屏幕看起来好像用户已经完成了吗?
这是我的解决方案:
if (pcv.CanSort == true)
{
pcv.SortDescriptions.Add(new SortDescription("ProductionStatus", ListSortDirection.Ascending));
pcv.SortDescriptions.Add(new SortDescription("Date", ListSortDirection.Descending));
}
,其中 pcv 是一个 PageCollectionView。这首先按 ProductionStatus 属性排序,然后按 Date 属性排序。它仅显示第二列的小排序箭头。
我也需要这样做,并且深入研究 DataGrid 是否可以做到这一点。
实际上 DataGridColumnHeader 类上有一个适当的方法,即 InvokeProcessSort,但它是内部的,在 DataGrid 类的其他任何地方都没有出现。
我所能做的就是在绑定数据之前对数据进行预排序。我正在使用实现 ICollectionView 以及 ObservableCollection<> 的自定义数据集合,这可以正常工作 - 但它不是最佳的,并且不一定需要大量工作。
此外,提供预先排序的集合意味着网格不显示排序标记。
我将在 DataGrid 错误跟踪器上将此作为一个问题提出 - 这是一个相当大的遗漏,很容易修复 - MS 只需要在 DataGridColumn 和 DataGrid 类上公开适当的方法。
发现 Paul Sherrif 的一篇很好的小文章为我们解决了这个问题……
http://weblogs.asp.net/psheriff/archive/2010/07/14/use-collectionviewsource-in-silverlight.aspx
基本上,无论如何我们都将 DataGrid 绑定到 CollectionViewSource。原来这有一个 CollectionViewSource.SortDescriptions 配置集,可以让我们指定默认排序顺序。
谢谢保罗!
只需将 SortDescriptor 添加到 DomainDataSource:
<riaControls:DomainDataSource.SortDescriptors>
<riaControls:SortDescriptor PropertyPath="ColumnName" Direction="Descending" />
</riaControls:DomainDataSource.SortDescriptors>
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}}"/>
我对微软样本的更正:
<sort:SortDescription
PropertyName="Name"
Direction="Ascending"
xmlns:sort="clr-namespace:System.ComponentModel;assembly=System.Windows"
/>