definir a ordem de classificação inicial no Silverlight DataGrid?
-
03-07-2019 - |
Pergunta
Quando eu carregar dados em um controle Silverlight DataGrid, como posso fazer o olhar da tela exatamente como se o usuário tivesse clicado no cabeçalho da primeira coluna? Em outras palavras, os dados devem ser classificados em ordem crescente de acordo com valores que de coluna e uma pequena seta tipo deve ser exibido no cabeçalho da primeira coluna.
Assumindo que é possível, pode também fazê-lo parecer como se o usuário tivesse clicado na primeira coluna e, em seguida, Shift-clicado no segundo? Em outras palavras, eu posso programaticamente aplicar uma espécie de duas partes e tem a aparência da tela, como se o usuário tivesse feito isso?
Solução
Eu precisava fazer isso também, e olhou duro e profundo para saber se o DataGrid poderia fazer isso.
Não é na verdade um método apropriado na classe DataGridColumnHeader, nomeadamente InvokeProcessSort, mas é interno e não à tona em qualquer outro lugar nas classes DataGrid.
Tudo que eu fui capaz de fazer é pré-classificar os dados antes de eu vinculá-lo. Eu estou usando uma coleta de dados personalizado que implementa ICollectionView, bem como ObservableCollection <>, e isso funciona OK -. Mas não é ideal, e uma carga de trabalho que não é necessariamente necessário
Além disso, fornecendo uma coleção pré-ordenada significa a grade não mostra o marcador tipo.
Eu vou levantar isso como um problema sobre o bug-tracker DataGrid - esta é uma omissão bastante importante que seria bastante fácil de corrigir -. MS só precisa expor métodos apropriados em classes DataGridColumn e DataGrid
Outras dicas
Esta foi a minha solução:
if (pcv.CanSort == true)
{
pcv.SortDescriptions.Add(new SortDescription("ProductionStatus", ListSortDirection.Ascending));
pcv.SortDescriptions.Add(new SortDescription("Date", ListSortDirection.Descending));
}
, onde PCV é uma PageCollectionView. Isso classifica pela primeira vez por ProductionStatus propriedade e, em seguida, por propriedade de data. Ele exibe a pouca sorte arrow somente para segunda coluna embora.
Encontrou um bom pequeno artigo de Paul Sherrif que resolveu isso por nós ...
http: // weblogs. asp.net/psheriff/archive/2010/07/14/use-collectionviewsource-in-silverlight.aspx
Basicamente estávamos ligando o DataGrid a um CollectionViewSource de qualquer maneira. Acontece que isso tem um CollectionViewSource.SortDescriptions conjunto de configuração que nos permitem especificar a ordem de classificação padrão.
Graças Paul!
Basta adicionar uma SortDescriptor ao DomainDataSource:
<riaControls:DomainDataSource.SortDescriptors>
<riaControls:SortDescriptor PropertyPath="ColumnName" Direction="Descending" />
</riaControls:DomainDataSource.SortDescriptors>
Existe um CollectionViewSource no Silverlight 3 +
http: / /msdn.microsoft.com/en-us/library/system.windows.data.collectionviewsource(v=vs.95).aspx
Há uma maneira fácil de definir em XAML a ordem de classificação padrão, como sugerido pela Microsoft:
Declare classificação na marcação usando 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}}"/>
encontrado em comentários em https: //connect.microsoft.com/VisualStudio/feedback/details/678782/set-default-sort-order-of-datagrid
A correção da mina para amostra da Microsoft:
<sort:SortDescription
PropertyName="Name"
Direction="Ascending"
xmlns:sort="clr-namespace:System.ComponentModel;assembly=System.Windows"
/>