Ich habe ein WPF DataGrid mit einigen Daten, die an LINQ mit SQL-Entitätsklassen gebunden sind. Eine Spalte ist eine Uhr, die die Flugzeit eines bestimmten Fluges zeigt, die anhand der Logik in Flights partieller Klasse berechnet wird. Ich habe einen Timer, der alle 2 Sekunden datagrid.Items.Refresh aufruft, um die Uhr zu aktualisieren.
Die Aktualisierung funktioniert einwandfrei, aber jetzt füge ich Tastaturkürzel hinzu. Das Navigieren durch Zellen mit den Pfeiltasten auf der Tastatur funktioniert gut, wenn der Timer ausgeschaltet ist. Wenn jedoch der Aktualisierungstimer aktiviert ist, verliert die fokussierte Zelle (eigentlich das gesamte Datagrid) den Fokus.
Ich muss entweder den Fokus beibehalten (bevorzugt) oder den Timer deaktivieren, wenn das DataGrid fokussiert ist. Ich kann nicht einmal scheinen, dass letzteres funktioniert. Ich habe es versucht:
%Vor%und
%Vor%für den Timer, aber diese Eigenschaften geben false zurück, selbst wenn das Datagrid fokussiert ist.
Irgendwelche Ideen?
Der beste Weg besteht darin, dataGrid.Items.Refresh () nicht als Aktualisierungsmechanismus zu verwenden. Es klingt wie die zugrunde liegenden Objekte bereits separat aktualisiert werden. Wenn sie INotifyPropertyChanged implementieren, sollten Sie versuchen, den Bindungsmodus für die Spalte als TwoWay-Bindung festzulegen:
%Vor%Ich denke, Sie können den aktuellen Fokus erhalten und nachdem das Gitter aufgefrischt ist, geben Sie der ausgewählten Zelle wieder ihren Fokus, etwa wie
%Vor%Überprüfen Sie auch dies heraus kann dir helfen
Ihre Zellen verlieren den Fokus, weil Sie die zugrunde liegende Auflistung (ItemsSource) ändern. Soweit ich mich erinnere, gibt es keinen schönen Weg, die Zelle zu bekommen. Für die Reihe:
Wenn Sie mit MVVM arbeiten, können Sie sich Ihre SelectedItem
oder SelectedIndex
merken und sie wiederherstellen, nachdem das erneute Laden durch Bindung erfolgt ist. Das bringt Sie für den Anfang in die richtige Reihe. Beide haben unterschiedliche Nachteile:
SelectedItem
erfordert etwas mehr Arbeit. Stellen Sie sicher, dass Sie Equals
und GetHashCode
in den zugrunde liegenden Objekten überschreiben, wenn Sie sie verwenden. Wenn Ihr Artikel die Nummer 5 in der Sammlung war und während des Neuladens eine andere Zeile davor angezeigt wird, landen Sie immer noch in der rechten Zeile SelectedIndex
ist die schnellste Lösung, ist aber nur eine numerische Position. Wenn Sie die Eintragsnummer 5 auswählen und die Zusammenführungen in Zeilen davor neu laden, erhalten Sie die falsche Zeile. Wie gesagt, ich habe es nicht mit den Zellen versucht, aber Sie können das für den Anfang. Vielleicht können Sie es auf Ihr Problem anwenden.