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
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
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
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
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.
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.
Tags und Links wpf refresh focus datagrid itemssource