我已经在这方面工作了几天,但似乎无法想出一个解决方案
我在计时器上有代码,每隔几秒刷新一次DataGrid
我尝试了很多刷新选项,但最终他们都失去了用户关注点,有时也失去了SelectedItem
继承我的代码:
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
我离开了评论,所以你可以看到我尝试的不同方法
结果:
如果我直接将ItemsSource
与结果一起设置(如在评论中),那么SelectedItem
和Keyboard.FocusedElement
会保持稳定直到上述代码的结尾,但介于两者之间这段代码的结尾和下一个勾号都变为Nothing
如果我使用ObservableCollection
,那么SelectedItem
会在我清除收藏后立即丢失,Keyboard.FocusedElement
只会在滴答之间的某个时间丢失。虽然可以使用临时支持变量
所以重点是如何在保持(最重要的)键盘焦点的同时刷新数据库中的项目
是的,我知道ObservableCollections
没有被“重置”。事实上,我真的不想使用它。它只有一个保持SelectedItem
P.S。我也试过挂钩几个事件(OnItemsSourceChanged
,SourceUpdated
...)但他们没有在正确的时间被解雇,或根本没有开火
任何想法?
id非常感谢
谢谢
答案 0 :(得分:1)
您需要使用SelectedIndex而不是DataGrid的SelectedItem属性。在使用lst。
替换ItemsSource之前保存所选索引SelectedItem不起作用的原因是这是对要替换的列表中对象的引用。
也许您不想使用索引,因为根据数据库更新,焦点项可能会向上或向下移动。在这种情况下,您需要使用密钥在新列表中查找记录的索引。
如果您无法使用索引或没有密钥,那么我就无法想到这样做的好方法。
在我看来,完全更换清单会导致其他问题。如果用户在DataGrid单元格中键入内容并替换其下的列表,则会丢失其编辑内容。
答案 1 :(得分:0)
您最好的选择如下:
当用户进行选择时,将索引或当前的selecteditem保存在变量中。
在CollectionChanged中甚至在你的集合中重新将所选项目分配给你在变量中保存的任何内容。 CollectionChanged事件在集合中的任何更改后触发,因此您可以进行后处理,在这种情况下重新分配所选项目。
答案 2 :(得分:0)
您是否确认您拥有该对象的相同的实例?即SelectedItem
中必须存在lst2
。否则,您需要在新列表中找到匹配项并改为使用该对象。