2017-02-27 4 views
0

Ich habe 3 Datagrid-Spalten, die an verschiedene Konverter gebunden sind, die Objektfelder in eine Zeichenfolge konvertieren.WPF-Datagrid-Spalte an Konverter sortierbar machen

Jetzt mit einer CollectionView zum Sortieren, wie kann ich die Spalten, die einen Konverter verwenden sortierbar machen?

Ich benutze Entity Framework Database First, also denke ich, dass ich keine DependencyProperty zum Objekt hinzufügen kann, welche Felder im Datagrid angezeigt werden. Das Hinzufügen weiterer Felder zum Objekt in der Datenbank ist keine Option.

Gibt es dafür eine elegante Lösung?

XAML Beispielcode:

<DataGridTextColumn Width="200" Header="Status" SortMemberPath="myPath"> 
    <DataGridTextColumn.Binding> 
     <Binding Converter="{StaticResource fieldsToStringConverter}"/> 
    </DataGridTextColumn.Binding> 
</DataGridTextColumn> 

Wie für C# habe ich die Collection die Filterung verarbeitet und Sortier aber Sortier nur noch für normale (nicht-Wandler) Säulen:

ICollectionView datagridView = CollectionViewSource.GetDefaultView(myDataGrid.ItemsSource); 
+0

Zeigen Sie Ihren Ansatz oder ein Stück Code –

+0

Fertig. Ich kann mir keinen Code mehr vorstellen, der postwürdig wäre. – user2586856

+0

Sie können Ihren Modellklassen immer noch nicht-datenbankspezifische (wahrscheinlich schreibgeschützte) Eigenschaften hinzufügen, nachdem alle generierten Klassen "partiell" sind, oder? – grek40

Antwort

0

Die Lösung Ich habe Für mich ausgewählt ist:

Ich verwende das Sortierungsereignis des DataGrid, um zu überprüfen, welche Spalte sortiert wurde. Wenn eine Spalte mit einem Konverter angeklickt wurde, speichere ich die aktuelle Sortierrichtung und ordne die DataGrid.ItemsQuelle neu, die nach dem Konverter sortiert ist, der eine neue CollectionView erstellt. Stellen Sie dann die Sortierrichtung der angeklickten Spalte auf die gespeicherte Sortierrichtung ein.

Das funktioniert auch gut, wenn ein Element hinzugefügt oder aus der Datenbank entfernt wird, da ich die Sortierereignisfunktion einfach als Aktualisierung verwenden kann, wenn die aktuelle Sortierung in einer der Spalten ist, die einen Konverter verwenden. Dies beinhaltet einige zusätzliche Codes, die im folgenden Beispiel der Übersichtlichkeit halber nicht aufgeführt sind.

XAML

<DataGrid x:Name="dataGrid" ... Sorting="dataGrid_Sorting"> 

...

<DataGridTextColumn Width="200" Header="Status" SortMemberPath="mySortMemberPath"> 
    <DataGridTextColumn.Binding> 
     <Binding Converter="{StaticResource myConverter}"/> 
    </DataGridTextColumn.Binding>  
</DataGridTextColumn> 

C#

private void dataGrid_Sorting(object sender, DataGridSortingEventArgs e) 
     { 
      string sortMemberPath = e.Column.SortMemberPath; 
      if (sortMemberPath == null || sortMemberPath == "") 
      { 
       return; 
      } 
      IValueConverter converter = null; 
      switch (sortMemberPath) 
      { 
       case "mySortMemberPath": 
        converter = new myConverter(); 
        break; 
      } 
      if (converter != null) 
      { 
       e.Handled = true; 
       ListSortDirection direction = (e.Column.SortDirection != ListSortDirection.Ascending) ? ListSortDirection.Ascending : ListSortDirection.Descending; 
       if (direction == ListSortDirection.Ascending) 
       { 
        dataGrid.ItemsSource = --sort my list with converter-- 
       } 
       else 
       { 
        dataGrid.ItemsSource = --sort my list with converter-- 
       } 
       datagridView = CollectionViewSource.GetDefaultView(dataGrid.ItemsSource); 
       e.Column.SortDirection = direction; 
       applyCollectionViewFilter(); 
      } 
     }