Fokus / SelectedItem beibehalten, nachdem DataGrid ItemsSource geändert wurde

9
Ich arbeite seit ein paar Tagen daran, aber es scheint mir keine Lösung zu geben.

Ich habe Code auf einem Timer, der die DataGrid alle paar Sekunden aktualisiert

Ich habe viele Aktualisierungsoptionen ausprobiert, aber am Ende verlieren alle den Fokus des Benutzers und manchmal auch SelectedItem

heres meinen Code:

%Vor%

Ich habe die Kommentare verlassen, damit Sie die verschiedenen Ansätze sehen können, die ich versucht habe

Ergebnisse:

Wenn ich ItemsSource direkt auf das Ergebnis setze (wie im Kommentar), bleiben SelectedItem und Keyboard.FocusedElement bis zum Ende des obigen Codes gleich, aber irgendwo zwischen dem Ende dieses Codes und Beim nächsten Tick werden beide in Nothing

umgewandelt

Wenn ich mit der ObservableCollection gehe, dann ist SelectedItem verloren, sobald ich die Sammlung lösche und Keyboard.FocusedElement wird nur irgendwann zwischen Ticks verloren. obwohl das SelectedItem hier mit einer temporären Unterstützungsvariablen

beibehalten werden kann

Also ist der Punkt, wie aktualisieren wir die Elemente aus der db, während immer noch (am wichtigsten) der Tastaturfokus

und ja, ich weiß, dass ObservableCollections nicht "zurückgesetzt" werden. Tatsächlich bin ich nicht wirklich daran interessiert, einen zu benutzen. Es hat nur ein Plus davon, die SelectedItem

zu behalten

P.S. Ich habe auch versucht, in mehrere Ereignisse ( OnItemsSourceChanged , SourceUpdated ...) einzuhaken, aber sie wurden nicht zum richtigen Zeitpunkt gefeuert oder gar nicht ausgelöst

irgendwelche Ideen?

id wirklich am meisten schätzen

danke

    
Yisroel M. Olewski 01.05.2013, 13:17
quelle

3 Antworten

1

Sie müssen den SelectedIndex anstelle der SelectedItem-Eigenschaft des DataGrids verwenden. Speichern Sie den ausgewählten Index, bevor Sie ItemsSource durch 1. ersetzen.

Der Grund, warum SelectedItem nicht funktioniert, ist, dass dies ein Verweis auf ein Objekt in der Liste ist, die Sie ersetzen.

Vielleicht möchten Sie den Index nicht verwenden, da sich das fokussierte Element je nach Datenbankaktualisierung möglicherweise nach oben oder unten bewegt. In diesem Fall müssen Sie den Schlüssel verwenden, um den Index des Datensatzes in der neuen Liste zu finden.

Wenn Sie den Index nicht verwenden können oder keinen Schlüssel haben, kann ich mir keinen guten Weg vorstellen.

Auch scheint mir, dass das vollständige Ersetzen der Liste zu anderen Problemen führen wird. Wenn der Benutzer etwas in die DataGrid-Zelle eingibt und Sie die Liste darunter ersetzen, werden die Änderungen verloren.

    
AQuirky 22.02.2017 18:23
quelle
0

Ihre beste Option ist die folgende:

Wenn ein Benutzer eine Auswahl trifft, speichern Sie den Index oder das aktuelle ausgewählte Element in einer Variablen.

In der CollectionChanged selbst in Ihrer Sammlung ordnen Sie das ausgewählte Element dem an, was Sie zuvor in der Variablen gespeichert haben. Das CollectionChanged-Ereignis wird nach jeder Änderung in der Sammlung ausgelöst, so dass Sie eine Nachbearbeitung durchführen können. In diesem Fall wird das ausgewählte Element neu zugewiesen.

    
Omar Zaarour 08.06.2015 18:46
quelle
0

Haben Sie verifiziert, dass Sie die selbe Instanz des Objekts haben? I.e. SelectedItem muss in lst2 existieren. Andernfalls müssen Sie das übereinstimmende Element in der neuen Liste finden und stattdessen dieses Objekt verwenden.

    
l33t 15.12.2016 16:36
quelle