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?

Foi útil?

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"
   /> 
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top