2010-10-04 15 views
12

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> 

Antwort

23

Das Problem ist dieser Code

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

Die Standardsortierung funktioniert wie überall nur angegeben für Datagridtextcolumn, DataGridComboBoxColumn usw.

Jetzt kann das Gitter nicht sortieren, weil Sie ein DataTemplate und ein Label darin definiert haben. Eine andere Person könnte ein SstackTemplate usw. in DataTemplate definiert haben. Das DataGrid wird also nicht wissen, wie es zu sortieren ist.

Ich werde versuchen, Ihnen einen Beispielcode sehr bald als was wir für solche DataGridTemplateColumn tun können. Aber hoffe, die Richtung, die ich dir gegeben habe, hilft !!


Scheint, dass die Antwort sehr einfach ist. Ich versuchte es mit einer Probe Datagrid mit MVVM aber meine Lösung sollte für Sie arbeiten, ich fühle mich

Alles ist in die folgenden Datagridtemplatecolumn in Ordnung, aber Sie sind ein sehr wichtiges Attribut namens SortMemberPath fehlt. Thw WPF sollte wissen, auf welches Eigentum es sortieren sollte.

Das Original, das Sie wie folgt aussieht

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


Ich weiß Strukturen Ihre Daten nicht. Aber die modifizierte sollte so aussehen

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

ich hoffe es hilft dir !! Lassen Sie mich wissen, wenn es dir nicht helfen, ich werde versuchen, meine Anwendung in einigen Blog zu schreiben (ich faul bin es aber zu tun !!)

+0

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

+1

@Paul - Ich glaube, Sie haben gerade ein Attribut namens "SortMemberPath" vermisst. Ich hoffe es hilft!! – GuruC

+0

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

0

Versuchen Sie dieses: SortMemberPath = „Complete“

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

Wie unterscheidet sich Ihre Antwort von der angenommenen Antwort? Der Wert von SortMemberPath sollte eine Spalte der Datenquelle benennen. "Vollständig" ist keine meiner Mitgliederspalten. –

+0

Ich habe die obige Antwort nicht gesehen, vielleicht hat er/sie gepostet, während ich meine bearbeitet habe. In Bezug auf den Header-Namen, habe ich es versucht, meine WPF-Test, wenn es funktioniert, müssen Sie nur den Header-Namen ändern. – Doro

Verwandte Themen