2008-10-22 9 views
12

Lorsque je charge des données pour la première fois dans un contrôle Silverlight DataGrid, comment puis-je faire en sorte que l'écran apparaisse exactement comme si l'utilisateur venait de cliquer sur l'en-tête de la première colonne? En d'autres termes, les données doivent être triées dans l'ordre croissant en fonction des valeurs de cette colonne, ET la petite flèche de tri doit être affichée dans l'en-tête de la première colonne.Définir l'ordre de tri initial dans Silverlight DataGrid?

En supposant que ce soit possible, est-ce que je peux aussi donner l'impression que l'utilisateur a cliqué sur la première colonne et ensuite cliqué sur la seconde? En d'autres termes, puis-je programmer un tri en deux parties et faire en sorte que l'écran ressemble à l'utilisateur?

Répondre

6

J'avais besoin de faire ceci aussi, et regardé dur et profondément si le DataGrid pourrait faire ceci.

Il existe en fait une méthode appropriée sur la classe DataGridColumnHeader, à savoir InvokeProcessSort, mais elle est interne et ne fait surface nulle part ailleurs dans les classes DataGrid.

Tout ce que j'ai pu faire est de pré-trier les données juste avant de les lier. J'utilise une collection de données personnalisée qui implémente ICollectionView ainsi que ObservableCollection <>, et cela fonctionne bien - mais ce n'est pas optimal, et une charge de travail qui n'est pas nécessairement nécessaire. De plus, en fournissant une collection pré-triée, la grille ne montre pas le marqueur de tri. Je vais soulever cette question comme un problème sur le bug-tracker DataGrid - c'est une omission assez importante qui serait assez facile à résoudre - MS a juste besoin d'exposer les méthodes appropriées sur les classes DataGridColumn et DataGrid.

+0

Deviner aucune mise à jour sur ce encore? – Coops

10

C'était ma solution:

if (pcv.CanSort == true) 
{ 
     pcv.SortDescriptions.Add(new SortDescription("ProductionStatus", ListSortDirection.Ascending)); 
     pcv.SortDescriptions.Add(new SortDescription("Date", ListSortDirection.Descending)); 
} 

, où est un pcv PageCollectionView. Cela trie d'abord par la propriété ProductionStatus, puis par la propriété Date . Il affiche la petite flèche de tri seulement pour la deuxième colonne.

+0

Cela a fonctionné pour moi aussi, merci! – Masha

+0

Je pense que cela a été retiré de Silverlight 4 –

+0

Je l'ai utilisé avec SL4, aussi. – Valentin

1

ajouter simplement un SortDescriptor au DomainDataSource:

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

Il existe un CollectionViewSource dans Silverlight 3+

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

Il est un moyen facile de définir en XAML l'ordre de tri par défaut, tel que suggéré par Microsoft:

Déclarez le tri dans le balisage à l'aide de 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}}"/> 

trouvé à commentaires dans https://connect.microsoft.com/VisualStudio/feedback/details/678782/set-default-sort-order-of-datagrid

Une correction de la mine à l'échantillon de Microsoft:

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