2012-01-22 33 views
21

En un WPF tengo un DataGrid con algunas columnas.Cuadrícula de datos en WPF - Prefijo de columna 1 ordenado

Por defecto, hay 1 que quiero ordenar, pero no puedo encontrar cómo puedo hacerlo.

La cuadrícula de datos en XAML se ve así:

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

Y el único código que hay detrás es:

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

Lo que no puedo encontrar es la manera de hacerlo de forma predeterminada en ordenadas la columna "Puntuación".

¿Alguien puede ayudarme apuntando en la dirección correcta?

+0

echar un vistazo a CollectionViewSource. –

+0

Ya probé esto: 'ICollectionView view = CollectionViewSource.GetDefaultView (dataGrid1.ItemsSource); view.SortDescriptions.Clear(); view.SortDescriptions.Add (nueva SortDescription ("LastName", ListSortDirection.Ascending)); view.Refresh(); 'Pero eso no parece funcionar con mi código anterior, no lo sé y no entiendo lo que debo hacer para que funcione – Dante1986

+0

¿Consideró clasificar sus hijos de TrackList? –

Respuesta

42

La solución para esto es más simple de lo que proporciona la respuesta actual.

NOTA: El uso de un CollectionViewSource le proporcionará más poder y control en estas situaciones. Cuando estás aprendiendo WPF recomiendo comprensión de cómo utilizar CollectionViewSource para resolver este problema, junto con otros problemas relacionados con la colección como Agrupación y Filtrado.

EDITAR: Esto puede deberse a cambios en la especificación. Esta respuesta se basa en el uso de .NET 4.0, no he investigado si esta solución funcionará en versiones anteriores del marco.

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

Todo lo que necesita hacer es elegir una columna y especifique una dirección de clasificación para esa columna.

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

Esto predeterminará la ordenación a la 2da columna en la dirección ascendente.

8

Editar: vea la respuesta de James LaPenn a continuación, debería ser la solución aceptada.


que describe cómo ordenar en el código por primera vez de las columnas aquí: Initial DataGrid Sorting

Se puede adaptar el código para ordenar por la columna deseada específica, a pesar de todo el enfoque parece desordenado.

Si desea hacerlo en XAML ... lo que puede funcionar es la creación CollectionViewSource.SortDescriptions:

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

Pero nunca he probado este último.

+0

parece que este enlace que diste (http://stackoverflow.com/questions/8944822/initial-datagrid-sorting/8946420#8946420) funciona, pero con solo 1 inconveniente en este momento. ordena la primera columna (como se indica en el método), pero ¿cómo puedo hacerlo para ordenar el segundo (u otro)? – Dante1986

+0

lo obtuve ahora cambiando las Columnas.Primero(); a Columnas [1]; (¡Gracias!) – Dante1986

+1

Debe mencionar el espacio de nombres requerido 'xmlns: scm =" clr-namespace: System.ComponentModel; assembly = WindowsBase "' – kskyriacou

2

Si desea hacerlo mediante programación, puede hacerlo de esta manera:

MyDataGrid.ItemsSource = DataContext.RowItems.OrderBy(p => p.Score).ToList(); 
Cuestiones relacionadas