Pregunta Mantener Focus / SelectedItem after DataGrid ItemsSource change


He estado trabajando en esto por unos días, pero no puedo encontrar una solución

Tengo un código en un temporizador que actualiza el DataGrid cada pocos segundos

Probé muchas opciones de actualización, pero al final todos pierden el foco de los usuarios y, a veces también el SelectedItem

Aquí está mi código:

        AddHandler bw.RunWorkerCompleted, Function(sender As Object, e As ComponentModel.RunWorkerCompletedEventArgs)
                                              Dim lst = e.Result
                                              Dim lst2 = CType(lst, List(Of Object)).OfType(Of INotifyPropertyChanged)()
                                              'If Items.Count = 0 Then
                                              Dim a = SelectedItem
                                              Collection.Clear()
                                              Collection.AddRange(lst2)
                                              SelectedItem = a
                                              'ItemsSource = lst
                                              'End If
                                              'For Each rw In lst
                                              '    Dim mtch = Collection.Where(Function(x) x.GetHashCode = rw.GetHashCode)

                                              'Next

dejé los comentarios para que puedas ver los diferentes enfoques que probé

RESULTADOS:

si configuro directamente el ItemsSource con el resultado (como en el comentario), entonces el SelectedItem y el Keyboard.FocusedElement manténgase firme hasta el final del código anterior, pero en algún punto entre el final de este código y el próximo tick ambos se convierten en Nothing

si voy con el ObservableCollection entonces SelectedItem se pierde tan pronto como elimine la colección y Keyboard.FocusedElement solo se pierde en algún momento entre tics. aunque el elemento seleccionado se puede retener aquí con una variable de respaldo temporal

así que el punto es cómo renovar los elementos desde la base de datos mientras se mantiene (lo más importante) el foco del teclado

y sí, sé que ObservableCollections no están "hechos" para reiniciarse. de hecho, no estoy realmente interesado en usar uno. solo tiene una ventaja de mantener el SelectedItem

PD También intenté conectarme a varios eventos (OnItemsSourceChanged,SourceUpdated...) pero no fueron despedidos en el momento adecuado, o no dispararon en absoluto

¿algunas ideas?

Identificación realmente más apreciada

gracias


9
2018-05-01 13:17


origen


Respuestas:


Necesita utilizar SelectedIndex en lugar de la propiedad SelectedItem de DataGrid. Guarde el índice seleccionado antes de reemplazar ItemsSource con lst.

El motivo por el que SelectedItem no funciona es que esta es una referencia a un objeto en la lista que está reemplazando.

Tal vez no desee usar el índice porque el elemento enfocado puede moverse hacia arriba o hacia abajo según la actualización de la base de datos. En ese caso, deberá usar la clave para buscar el índice del registro en la nueva lista.

Si no puede usar el índice o no tiene una clave, no puedo pensar en una buena forma de hacerlo.

También me parece que reemplazar la lista completamente llevará a otros problemas. Si el usuario está escribiendo algo en la celda de DataGrid y usted reemplaza la lista debajo de ellos, perderán sus ediciones.


1
2018-02-22 18:23



Tu mejor opción es la siguiente:

Cuando un usuario hace una selección, guarda el índice o el elemento seleccionado actual en una variable.

en CollectionChanged, incluso en su colección, asigne el elemento seleccionado a lo que haya guardado anteriormente en la variable. El evento CollectionChanged se activa después de cualquier cambio en la colección, por lo que podrá realizar un procesamiento posterior, que en este caso es reasignar el elemento seleccionado.


0
2018-06-08 18:46



¿Has verificado que tienes el mismo instancia del objeto? Es decir. SelectedItem debe existir en lst2. De lo contrario, necesita encontrar el elemento correspondiente en la nueva lista y usar ese objeto en su lugar.


0
2017-12-15 16:36