当我第一次将数据加载到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错误跟踪器上提出此问题 - 这是一个相当重要的遗漏,很容易修复 - 微软只需要在DataGridColumn和DataGrid类中公开适当的方法即可。
我找到了一篇由Paul Sherrif撰写的好文章,为我们解决了这个问题...
http://weblogs.asp.net/psheriff/archive/2010/07/14/use-collectionviewsource-in-silverlight.aspx
基本上,我们无论如何都将DataGrid绑定到了CollectionViewSource。事实证明,这里有一个CollectionViewSource.SortDescriptions的设置,可以让我们指定默认的排序顺序。<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
有一种简单的方法可以在 XAML 中定义默认排序顺序,就像 Microsoft 建议的那样:
使用 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}}"/>
我对Microsoft示例的更正:
<sort:SortDescription
PropertyName="Name"
Direction="Ascending"
xmlns:sort="clr-namespace:System.ComponentModel;assembly=System.Windows"
/>