Hallo Community,
ich versuche eine Art mehrstufige Sortierung bei einer ListBox in WPF hinzubekommen. Dazu folgendes Beispiel (ich verichte auf die ganzen PropertyChanges etc. aufrufe der Übersichtlichkeit halber)
public class Data
{
public string Name,
public string Category
public int Index // das ist der Index aus der Quelle von dem die Daten kommen, dieser kann mehrfach herkommen
public int Offset
}
Ich habe eine ObservableCollection<Data> die habe ich an eine CollectionViewSource gebunden und die wieder rum an die Listbox. Über
<PropertyGroupDescription Converter="{StaticResource dataToGroupConverter}" CustomSort="{StaticResource GroupComparer}"/>
Habe ich einen Converter der die Category zu einer GruppenID macht und der Comparer sortiert die Gruppen dann entsprechend nach. Es gibt noch TemplateSelektoren die ja nach GruppenID ein anderen Style laden aber das spielt gar nicht so eine Rolle.
Vereinfacht wird dann im ListBox folgendes angezeigt:
- Category 1
- "[Name]" // Instance OBJ 1 hat dann Index 0
- "[Name]" // Instance OBJ 2 hat Index 3
- Category 2
- "[Name]" // Instance OBJ 3 hat dann Index 1
- "[Name]" // Instance OBJ 4 hat dann Index 2
- Category 3
- "[Name]" // Instance OBJ 5 hat dann Index 1
- "[Name]" // Instance OBJ 6 hat dann Index 3
Im Moment habe ich eine Problem mit der Sortierung innerhalb einer Gruppe. Die ist aktuell der Reihenfolge wie sie hinzugefügt wurde zur Collection. Was ich jetzt bräuchte das ist eine Arte zweite Sortierung in Abhängigkeit der ersten Sortierung. D.h.
Im ersten Schritt sortiere ich alle Mitglieder einer Kategory nach dem Index dann kommt das Beispiel oberen aus. Nun habe ich eine Offset Wert der sagt das mein Position verschoben werden kann (am Beispiel)
// Nach erster Sortierung
- "Kategory 1"
- "Wert 1" // Obj: Name = "Wert 1", Category = "Kategory 1", Index = 0, Offset = 0
- "Wert 1" // Obj: Name = "Wert 2", Category = "Kategory 1", Index = 3, Offset = 0
- "Wert 2" // Obj: Name = "Wert 3", Category = "Kategory 1", Index = 4, Offset = -2
// Nach zweiter Sortierung
- "Kategory 1"
- "Wert 2" // Obj: Name = "Wert 3", Category = "Kategory 1", Index = 4, Offset = -2
- "Wert 1" // Obj: Name = "Wert 1", Category = "Kategory 1", Index = 0, Offset = 0
- "Wert 1" // Obj: Name = "Wert 2", Category = "Kategory 1", Index = 3, Offset = 0
Ich verschiebe also visuell durch den Offset Wert meine Position innerhalb der Gruppe.
Meine erste Idee war die SortDescriptions bzw. CollectionViewSource im Code-behind zu ListCollectionView zu casten und CustomSort zu nutzen. Das wird aber auf alle Elemente der ItemsSource angewandt. Da kenn ich ich als den "GruppenIndex" noch nicht. Eine weitere Idee war eine zweite sortierte Liste mitlaufen zu lassen aus denen ich dann die "GruppenIndexes" berechnen und dann den Offset dazunehme. Aber dann habe ich eine weitere Datenstruktur die ich pflegen muss.
Was irgendwie fehlt das man einen weiteren Comparer für die Items innerhalb einer Gruppe anhängen kann.
Vielleicht hat einer eine Idee?
Grüße