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>
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. –
@Paul: creo que faltaste un atributo llamado "SortMemberPath". ¡¡Espero eso ayude!! – GuruC
¡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. –