Dans un WPF, j'ai un DataGrid avec quelques colonnes.
Par défaut, il y en a 1 que je veux faire trier, mais je n'arrive pas à trouver comment je peux le faire.
Le DataGrid en XAML ressemble à ceci:
<DataGrid x:Name="LibraryView" ItemsSource="{Binding Path=Elements[Persons]}" IsReadOnly="True" LoadingRow="dg_LoadingRow">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Path=Element[Name].Value}" IsReadOnly="True" />
<DataGridTextColumn Header="Score" Binding="{Binding Path=Element[Score].Value}" IsReadOnly="True" />
<DataGridTextColumn Header="Date" Binding="{Binding Path=Element[Date].Value}" IsReadOnly="True" />
</DataGrid.Columns>
</DataGrid>
Et le seul code derrière c'est:
public ScoreBoard()
{
InitializeComponent();
DataSet ds = dweMethods.DecryptAndDeserialize("ScoreData.xml");
XElement TrackList = XElement.Parse(ds.GetXml());
LibraryView.DataContext = TrackList;
}
Ce que je ne trouve pas, c'est comment le faire par défaut trié dans la colonne "Score".
Quelqu'un peut-il m'aider à me pointer dans la bonne direction?
REMARQUE: L'utilisation d'une CollectionViewSource vous fournira plus de puissance et de contrôle dans ces situations. Lorsque vous apprenez WPF, je recommande de comprendre comment utiliser CollectionViewSource pour résoudre ce problème ainsi que d'autres problèmes liés à la collection tels que Grouping et Filtering.
EDIT: Cela peut être dû à des changements dans les spécifications. Cette réponse est basée sur l'utilisation de .NET 4.0, je n'ai pas recherché si cette solution fonctionnera dans les anciennes versions du framework.
Étant donné ce XAML
<DataGrid x:Name="LibraryView" ItemsSource="{Binding Path=Elements[Persons]}" IsReadOnly="True" LoadingRow="dg_LoadingRow">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Path=Element[Name].Value}" IsReadOnly="True" />
<DataGridTextColumn Header="Score" Binding="{Binding Path=Element[Score].Value}" IsReadOnly="True" />
<DataGridTextColumn Header="Date" Binding="{Binding Path=Element[Date].Value}" IsReadOnly="True" />
</DataGrid.Columns>
</DataGrid>
Il vous suffit de choisir une colonne et de spécifier un sens de tri pour cette colonne.
<DataGrid x:Name="LibraryView" ItemsSource="{Binding Path=Elements[Persons]}" IsReadOnly="True" LoadingRow="dg_LoadingRow">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Path=Element[Name].Value}" IsReadOnly="True" />
<DataGridTextColumn Header="Score" Binding="{Binding Path=Element[Score].Value}" IsReadOnly="True" SortDirection="Ascending" />
<DataGridTextColumn Header="Date" Binding="{Binding Path=Element[Date].Value}" IsReadOnly="True" />
</DataGrid.Columns>
</DataGrid>
Ceci triera par défaut la 2ème colonne dans le sens ascendant.
J'ai décrit comment trier le code par la première des colonnes ici: Tri initial DataGrid
Vous pouvez adapter le code pour trier par votre colonne spécifique souhaitée, bien que toute l'approche semble désordonnée.
Si vous voulez le faire en XAML ... ce qui peut fonctionner est de définir CollectionViewSource.SortDescriptions:
<CollectionViewSource x:Key="cvs" Source="{StaticResource myItemsSource}">
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="MyPropertyName" Direction="Ascending"/>
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
Mais je n'ai jamais essayé ce dernier.
Si vous voulez le faire par programme, vous pouvez le faire comme ceci:
MyDataGrid.ItemsSource = DataContext.RowItems.OrderBy(p => p.Score).ToList();
Vous pouvez utiliser un ICollectionView
dans votre code derrière. En supposant que vous avez défini ObservableCollection<yourPersonClass> Persons
et Names
est une propriété de yourPersonClass
public ICollectionView View;
View = CollectionViewSource.GetDefaultView(Persons);
View.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending));
View.Refresh();