Ich versuche, meine erste WPF-Anwendung mit einem MVVM-Entwurfsmuster zu implementieren.WPF4 Datagrid sortiert nicht nach Spaltenüberschriften
Ich habe eine Anwendung erstellt, die eine Datenbindung an eine ObservableCollection <>. Die Anwendung wird zwar gerendert, aber ich erwarte, dass das Datagrid die Zeilen neu sortiert, wenn ich auf die Spaltenüberschriften klicke.
Ich habe Beiträge recherchiert, die sagten: Die Datenquelle muss IEnumerable implementieren, meins tut. Ich muss CanUserSortColumns und/oder CanUserSort (für jede Spalte), habe ich getan. Ich könnte eine benutzerdefinierte Sortierung implementieren, indem ich die Sortier-Callback-Funktion, die ich tat.
Keiner von diesen scheint geholfen zu haben. Im Debugger wird meine Funktion _customerGrid_Sorting nie aufgerufen und das Klicken auf die Spaltenüberschriften hat keine Auswirkung.
Fehle ich etwas in der XAML, die folgt? Gibt es eine andere Schnittstelle, die ich implementieren muss? Ich fühle mich jetzt sehr verloren, so dass jede Hilfe geschätzt wird.
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>
Danke Guru, das hilft ein wenig. Zumindest weiß ich, warum das standardmäßige Sortierverhalten nicht funktioniert.Ich nehme an, dass ich eine benutzerdefinierte Sortierung implementieren muss. Was ich dachte, könnte ich tun, indem ich einen Handler im Sorting-Attribut des DataGrids spezifiziere. Aber mein Handler feuert nicht. Ich freue mich auf Ihr Codebeispiel, um mir mehr Orientierung zu geben. –
@Paul - Ich glaube, Sie haben gerade ein Attribut namens "SortMemberPath" vermisst. Ich hoffe es hilft!! – GuruC
Große Antwort Guru! Danke für Ihre Hilfe! Ich werde hinzufügen, dass durch das Angeben der SortMemberPath = "CustID" (zum Beispiel) auf der DataGridTemplateColumn, konnte ich das Sortier-Attribut auf dem DataGrid und entfernen Sie meine benutzerdefinierte Implementierung von IComparer. Ich deine Antwort hilft anderen. Wenn jemand Fragen zur Lösung hat, werde ich versuchen, ihnen zu helfen. –