web-dev-qa-db-fra.com

Grille de données dans WPF - 1 colonne triée par défaut

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?

26
Dante1986

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.

47
SomeInternetGuy

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.

10
doblak

Si vous voulez le faire par programme, vous pouvez le faire comme ceci:

 MyDataGrid.ItemsSource = DataContext.RowItems.OrderBy(p => p.Score).ToList();
3
Charles Clayton

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();
2
Gideon