10

我已经为此工作了几天,但似乎无法提出解决方案

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只会在滴答声之间的某个时间丢失。尽管 SelectedItem 可以通过临时支持变量保留在这里

所以关键是我们如何在保持(最重要的)键盘焦点的同时刷新数据库中的项目

是的,我知道这ObservableCollections不是“制造”要重置的。事实上,我对使用一个并不感兴趣。它只是保留了一个加号SelectedItem

PS我也尝试挂钩几个事件(OnItemsSourceChangedSourceUpdated...),但他们没有在正确的时间被解雇,或者根本没有被解雇

有任何想法吗?

我真的很感激

谢谢你

4

3 回答 3

1

您需要使用 SelectedIndex 而不是 DataGrid 的 SelectedItem 属性。在将 ItemsSource 替换为 lst 之前保存选定的索引。

SelectedItem 不起作用的原因是这是对您要替换的列表中的对象的引用。

也许您不想使用索引,因为焦点项目可能会根据数据库更新向上或向下移动。在这种情况下,您将需要使用键在新列表中查找记录的索引。

如果您不能使用索引或没有密钥,那么我想不出一个好方法来做到这一点。

在我看来,完全替换列表会导致其他问题。如果用户在 DataGrid 单元格中输入内容并且您替换了他们下面的列表,他们将丢失他们的编辑。

于 2017-02-22T18:23:57.890 回答
0

您的最佳选择如下:

当用户进行选择时,将索引或当前选定项保存在变量中。

在 CollectionChanged 中,即使在您的集合中,也将所选项目重新分配给您之前保存在变量中的任何内容。CollectionChanged 事件在集合发生任何更改后触发,因此您将能够进行后期处理,在这种情况下重新分配所选项目。

于 2015-06-08T18:46:01.340 回答
0

您是否验证过您拥有相同的对象实例?即SelectedItem必须存在于lst2. 否则,您需要在新列表中找到匹配的项目并使用该对象。

于 2016-12-15T16:36:13.130 回答