Laden...

Wie ermittle ich in einem gefilterten DataGrid den korrekten Index der aktuell selektierten Zeile

Erstellt von Brendan vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.590 Views
B
Brendan Themenstarter:in
39 Beiträge seit 2006
vor 6 Jahren
Wie ermittle ich in einem gefilterten DataGrid den korrekten Index der aktuell selektierten Zeile

Hallo,

Wir arbeiten derzeit mit VS2015 an einer WPF-Applikation mit MVVM, die den DataGrid verwendet.

In den DataGrids haben wir unter Umständen die Möglichkeit, Daten zu filtern, was Einfluss auf die Items-Collection des DataGrid hat.
Nehmen wir an im ungefilterten Zustand enthält die Liste 100 Items, so sind es nach dem Filtern beispielsweise nur noch 20.

Wenn wir eine bestimmte Zeile im DataGrid doppelklicken, öffnet sich ein Edit-Dialog, in dem man Daten der betreffenden Zeile ändern und speichern kann.
Nach dem Schließen dieses Dialogs merken wir uns zuerst den aktuellen SelectedIndex des Grid, lesen die Daten neu in die Source ein (wodurch der SelectedIndex auf -1 gestellt wird) und setzen dann in SelectedIndex den gemerkten Index.

Wenn der DataGrid nicht gefiltert ist kann man den Index entweder auf zweierlei Art feststellen:

int currentIndex = grid.Items.IndexOf(grid.CurrentItem);

oder

int currentIndex = grid.SelectedIndex;

Wenn nun aber der Grid gefiltert ist, erhalten wir einen falschen Index.

Zum Beispiel:
Wir editieren im gefilterten Zustand die erste Zeile, die unter normalen Umständen die vierte in der Liste ist (Index = 3), aber wir bekommen Index = 0.
Wenn nun der Index 0 in einer Variable gemerkt wird und man nach dem Refresh der Source diesen wieder in SelectedIndex einstellt, wird nicht die erste Zeile in der gefilterten Liste selektiert, sondern die erste Zeile in der ungefilterten Gesamtliste.
Bei einem Blick auf das aktuelle SelectedItem zeigt sich sehr schnell, dass dieses das falsche ist.

Zwischenzeitlich habe ich noch den ItemContainerGenerator ausprobiert, aber leider auch hier ohne Erfolg:

var row = grid.ItemContainerGenerator.ContainerFromIndex(grid.SelectedIndex);
vm.RefreshList();
grid.SelectedIndex = grid.ItemContainerGenerator.IndexFromContainer(row);

In diesem Fall ist die Variable row nach dem Aufruf der Methode RefreshList Disconnected, also nicht mehr verfügbar.
Und selbst wenn ich vor dem Aufruf von RefreshList mit IndexFromContainter den Index von row hole erhalte ich den falschen Index - also auch hier 0 anstelle von 3.

Womit wir zur großen Frage kommen, wie kann ich den richtigen Index ermitteln - unabhängig davon, ob der DataGrid gefiltert ist oder nicht?

Vielen Dank im voraus.

Die Lösung ist immer ganz einfach.
Nur der Weg dorthin ist schwierig!

D
985 Beiträge seit 2014
vor 6 Jahren

Nach jedem Refresh - egal ob gefiltert oder nicht - kann an dem Index n ein völlig anderer Datensatz liegen als vor dem Refresh.

Da ist es sinnvoller über eine ID den Index in der aktuellen Liste zu suchen und darauf zu positionieren.

B
Brendan Themenstarter:in
39 Beiträge seit 2006
vor 6 Jahren

Vielen Dank Sir Rufo!

Hast Recht, eine kleine foreach-Schleife über die Items mit einer zuvor gemerkten PKI wirkt wahre Wunder.
Nochmals Danke für den Tipp.

Die Lösung ist immer ganz einfach.
Nur der Weg dorthin ist schwierig!