2012-01-22 25 views
21

In un WPF ho un DataGrid con poche colonne.Datagrid in WPF - 1 colonna predefinita ordinata

In base alle impostazioni predefinite, c'è 1 a cui desidero eseguire l'ordinamento, ma non riesco a trovare il modo in cui posso farlo.

Il DataGrid in XAML si presenta così:

<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> 

E l'unico codice che sta dietro è:

public ScoreBoard() 
{ 
    InitializeComponent(); 
    DataSet ds = dweMethods.DecryptAndDeserialize("ScoreData.xml"); 
    XElement TrackList = XElement.Parse(ds.GetXml()); 
    LibraryView.DataContext = TrackList; 
} 

Quello che non riesco proprio a trovare è come renderlo di default ordinato in base la colonna "Punteggio".

Qualcuno può aiutarmi a indicarmi la giusta direzione?

+0

un'occhiata a CollectionViewSource. –

+0

Ho già provato questo: 'ICollectionView view = CollectionViewSource.GetDefaultView (dataGrid1.ItemsSource); view.SortDescriptions.Clear(); view.SortDescriptions.Add (new SortDescription ("LastName", ListSortDirection.Acending)); view.Refresh(); 'Ma questo non sembra funzionare con il mio codice precedente, non so e non capisco cosa dovrei fare per farlo funzionare – Dante1986

+0

hai considerato di ordinare i tuoi figli TrackList? –

risposta

42

La soluzione per questo è più semplice della risposta attuale.

NOTA: utilizzo di un CollectionViewSource vi fornirà con più potenza e controllo in queste situazioni. Quando stai imparando WPF vi consiglio capire come utilizzare CollectionViewSource per risolvere questo problema, insieme ad altri problemi legati collezione come Raggruppamento e Filtering.

MODIFICA: Ciò può essere dovuto a modifiche nelle specifiche. Questa risposta si basa sull'utilizzo di .NET 4.0, non ho studiato se questa soluzione funzionerà con versioni precedenti del framework.

Dato questo 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> 

Tutto quello che devi fare è scegliere una colonna e specificare una direzione di ordinamento per quella colonna.

<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> 

In questo modo, l'ordinamento viene spostato sulla seconda colonna in direzione ascendente.

8

Modifica: vedere la risposta di James LaPenn in basso, dovrebbe essere la soluzione accettata.


ho descritto come ordinare in codice prima delle colonne qui: Initial DataGrid Sorting

Si potrebbe adattare il codice per ordinare la vostra specifica colonna desiderata, anche se l'intero approccio sembra disordinato.

Se si vuole fare in XAML ... che cosa può funzionare è la creazione CollectionViewSource.SortDescriptions:

<CollectionViewSource x:Key="cvs" Source="{StaticResource myItemsSource}"> 
    <CollectionViewSource.SortDescriptions> 
     <scm:SortDescription PropertyName="MyPropertyName" Direction="Ascending"/> 
    </CollectionViewSource.SortDescriptions> 
</CollectionViewSource> 

ma non ho mai provato quest'ultimo.

+0

questo link che hai fornito (http://stackoverflow.com/questions/8944822/initial-datagrid-sorting/8946420#8946420) sembra davvero funzionare, ma con solo 1 svantaggio al momento. ordina la prima colonna (come indicato nel metodo) ma come posso farlo per ordinare il secondo (o un altro)? – Dante1986

+0

ottenuto ora modificando Columns.First(); a colonne [1]; (grazie!) – Dante1986

+1

Si dovrebbe menzionare lo spazio dei nomi richiesto 'xmlns: scm =" clr-namespace: System.ComponentModel; assembly = WindowsBase "' – kskyriacou

2

Se volete farlo programatically, è possibile farlo in questo modo:

MyDataGrid.ItemsSource = DataContext.RowItems.OrderBy(p => p.Score).ToList(); 
Problemi correlati