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
Mit freundlichen Grüßen
lutzeslife
Hallo lutzeslife
Man kann doch mit CollectionViewSource nach mehreren Spalten sortieren. Siehe hier: https://stackoverflow.com/questions/8104015/how-to-implement-multiple-levels-of-sorting-on-a-collectionviewsource
Hast du das schon ausprobiert?
Gruß
Alf
Ja das hatte ich mir angeschaut, aber da ist keine Bindung möglich um mehre Inputparameter zu berücksichtigen. Daher muss ich es jetzt anders lösen und das Datenmodell diesbezüglich aufbohren
Mit freundlichen Grüßen
lutzeslife
Verstehe ich nicht, da wird doch nach mehreren Spalten sortiert:
"You can always add to multiple SortDescriptor to the SortCollection of your default view like this -"
ListCollectionView lcv = (ListCollectionView)CollectionViewSource.GetDefaultView(myCollection);
lcv.SortDescriptions.Add(new SortDescription(…));
"I don't know how to write it in VB, but i can show you in c# how it's made:"
YourListView = CollectionViewSource.GetDefaultView(tempListView
.OrderBy(x => x.FirstSorting)
.ThenBy(y => y.SecondSorting));
Machst du MVVM?
Man kan über mehre Spalten sortieren im klassischen Sinn. Man gibt einfach die Property an von dem Model das im DataContext
liegt. Das ist auch gar nicht das Problem sondern das SortDescription
ein struct
ist an deren Property
an die nicht gebunden werden kann.
YourListView = CollectionViewSource.GetDefaultView(tempListView
.OrderBy(x => x.FirstSorting)
.ThenBy(y => y.SecondSorting));
Das ist etwas anders hier erzeugt du zunächst ein neu Selektion die dann dem View übergeben wird.
Ich habe es jetzt anders gelöst. Ich erzeuge die CollectionViewSource
nun im XAML und gruppiere und Sortiere nach anderen Parametern. Über den VisualTree
als auch (ListCollectionView)ListBox.ItemsSource
komme ich ans View und damit an die erzeugten Gruppen und deren Sortierung damit arbeite ich dann weiter.
Mit freundlichen Grüßen
lutzeslife