Laden...

Sortierung in einer Gruppierung in Abhängigkeit der Position

Letzter Beitrag vor 19 Tagen 5 Posts 299 Views
Sortierung in einer Gruppierung in Abhängigkeit der Position

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 Propertyan 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