2010-10-04 13 views
12

Estoy tratando de implementar mi primera aplicación WPF utilizando un patrón de diseño MVVM.WPF4 Datagrid no ordena en los encabezados de columnas

Creé una aplicación que enlaza datos a un ObservableCollection <>. La aplicación rinde bien, pero espero que la cuadrícula de datos reordene las filas cuando hago clic en los encabezados de las columnas.

He investigado publicaciones que dicen: La fuente de datos debe implementar IEnumerable, la mía sí. Necesito establecer CanUserSortColumns y/o CanUserSort (en cada columna), lo hice. Podría implementar una ordenación personalizada especificando la función de devolución de llamada de clasificación, lo hice.

Ninguno de estos parece haber ayudado. En el depurador, mi función _customerGrid_Sorting nunca se llama y hacer clic en los encabezados de columna no tiene ningún efecto.

¿Me falta algo en el XAML que sigue? ¿Hay otra interfaz que necesito implementar? Me siento muy perdido en este momento, por lo que cualquier ayuda es apreciada.

XAML:

 <DataGrid Name="_customerGrid" 
      AutoGenerateColumns="False" 
      CanUserSortColumns="True" 
      ColumnHeaderStyle="{StaticResource columnHeaderStyle}" 
      HorizontalAlignment="Left" 
      ItemsSource="{Binding Path=AllCustomers}" 
      RowDetailsVisibilityMode="VisibleWhenSelected" 
      RowStyle="{StaticResource DataGridRowStyle}" 
      SelectionUnit="FullRow" 
      Sorting="_customerGrid_Sorting" 
      VerticalAlignment="Top"> 
      <DataGrid.Columns> 
       <DataGridTemplateColumn Header="Cust ID" MinWidth="90" CanUserSort="True" > 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <Label Content="{Binding Path=CustID}" /> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
       <DataGridTemplateColumn Header="Name" MinWidth="300" CanUserSort="True" Width="*"> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <Label Content="{Binding Path=Name}" /> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
      </DataGrid.Columns> 
     </DataGrid> 

Respuesta

23

El problema es el código

<DataGridTemplateColumn Header="Cust ID" MinWidth="90" CanUserSort="True" > 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <Label Content="{Binding Path=CustID}" /> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 

El valor por defecto funciona la ordenación como se ha dicho en todas partes sólo para DataGridTextColumn, DataGridComboBoxColumn, etc.

Ahora, aquí la cuadrícula no sabe cómo ordenar porque ha definido un DataTemplate y una etiqueta dentro de él. Alguna otra persona podría haber definido un SstackTemplate, etc. dentro de DataTemplate. Entonces, DataGrid no sabrá cómo ordenarlo.

Trataré de publicarle un código de muestra muy pronto como lo que podemos hacer para tal DataGridTemplateColumn. ¡Pero espero que la dirección que te he dado ayude!


Parece que la respuesta es muy simple. Lo he probado con una cuadrícula de datos muestra usando MVVM pero mi solución debe trabajar para que me siento

Todo está bien en el siguiente DataGridTemplateColumn pero se echa en falta un atributo muy importante que se llama SortMemberPath. Thw WPF debería saber en qué propiedad debería ordenar.

la original que usted envió tiene este aspecto

<DataGridTemplateColumn Header="Name" MinWidth="300" CanUserSort="True" Width="*"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <Label Content="{Binding Path=Name}" /> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
    </DataGridTemplateColumn> 


No sé sus estructuras de datos. Pero el modificado debería tener este aspecto

<DataGridTemplateColumn SortMemberPath="Name" Header="Name" MinWidth="300" CanUserSort="True" Width="*"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <Label Content="{Binding Path=Name}" /> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
    </DataGridTemplateColumn> 

espero que le ayuda !! Que me haga saber si no le ayuda, voy a tratar de publicar mi solicitud de alguna de blog (soy perezoso para hacerlo aunque !!)

+0

Gracias Guru, eso ayuda un poco. Al menos sé por qué el comportamiento de clasificación predeterminado no funciona.Supongo que eso significa que necesito implementar una ordenación personalizada. Lo cual pensé que podría hacer especificando un controlador en el atributo de clasificación de DataGrid. Pero mi controlador no dispara. Espero recibir su muestra de código para darme más instrucciones. –

+1

@Paul: creo que faltaste un atributo llamado "SortMemberPath". ¡¡Espero eso ayude!! – GuruC

+0

¡Gran respuesta, gurú! ¡Gracias por tu ayuda! Añadiré que al especificar SortMemberPath = "CustID" (por ejemplo) en DataGridTemplateColumn, pude eliminar el atributo Sorting en DataGrid y eliminar mi implementación personalizada de IComparer. Yo tu respuesta ayuda a otros. Si alguien tiene preguntas sobre la solución, intentaré ayudarlas. –

0

prueba este: SortMemberPath = "completo"

<DataGridTemplateColumn Header="CustID" SortMemberPath="Complete" MinWidth="90"  
CanUserSort="True" CanUserResize="True"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <Label Content="{Binding Path=CustID}"/> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 
+0

¿En qué se diferencia su respuesta de la aceptada? El valor de SortMemberPath debe nombrar una columna del origen de datos. "Completo" no es una de mis columnas miembro. –

+0

No vi la respuesta anterior, puede haber sido publicada mientras editaba la mía. En cuanto al nombre del encabezado, lo intenté con mi prueba wpf, si funciona solo necesitas cambiar el nombre del encabezado. – Doro

Cuestiones relacionadas