在 DataGrid ItemsSource 更改后保持 Focus/SelectedItem

Posted

技术标签:

【中文标题】在 DataGrid ItemsSource 更改后保持 Focus/SelectedItem【英文标题】:Keeping Focus/SelectedItem after DataGrid ItemsSource change 【发布时间】:2013-04-25 11:49:13 【问题描述】:

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

我有一个计时器上的代码,每隔几秒刷新一次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

我离开了 cmets,所以你可以看到我尝试过的不同方法

结果:

如果我直接将ItemsSource 设置为结果(如注释中所示),则SelectedItemKeyboard.FocusedElement 保持稳定直到上述代码的结尾,但介于此代码的结尾和下一个刻度它们都变成了Nothing

如果我使用ObservableCollection,那么一旦我清除集合,SelectedItem 就会丢失,Keyboard.FocusedElement 只会在滴答声之间的某个时间丢失。虽然 SelectedItem 可以通过临时支持变量保留在这里

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

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

附:我还尝试连接几个事件(OnItemsSourceChanged,SourceUpdated...),但它们没有在正确的时间被触发,或者根本没有触发

有什么想法吗?

我真的很感激

谢谢

【问题讨论】:

检查这个 - ***.com/questions/12808479/… 谢谢,在没有人在这里回答之后,我确实在 msdn 上发了一个很好的答案,它现在工作得很好。您设置的链接没有消息,我也考虑过逐个更新记录。但还没有解决。无论如何感谢您的关注! 你好 Yisman,你能把链接发到我可以看到解决方案的地方吗?它也将帮助我学习。谢谢:) social.msdn.microsoft.com/Forums/en-US/wpf/thread/… 在我看来,这里仅有的两种可能的解决方案是:A) 要么将 CurrentCell 信息保留在支持字段中,并在每次 ItemsSource 更改后重新设置它,或者 B) 不更改完全收集并“简单地”遍历项目,用它们的新值刷新它们。 【参考方案1】:

您的最佳选择如下:

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

嗨。最后,我最终只更改了数据库中实际更改的那些记录的属性。那成功了。无论如何,谢谢。【参考方案3】:

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

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

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

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

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

【讨论】:

感谢。最后我建立了一个ObservableCOllection。这成为 itemsource,然后我更新 observablecollection 中的各个属性,一切都很好。谢谢!

以上是关于在 DataGrid ItemsSource 更改后保持 Focus/SelectedItem的主要内容,如果未能解决你的问题,请参考以下文章

为啥更改 ItemsSource 时 DataGrid 不更新?

在 DataGrid ItemsSource 更改后保持 Focus/SelectedItem

在DataGrid完成使用异步ItemsSource加载后执行某些操作?

DataTable 作为 DataGrid.ItemsSource

数据更改后Datagrid不更新

wpf中,当DataGrid.ItemsSource与ObservableCollection绑定后,值变化时,DataGrid如何刷新?