在 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
设置为结果(如注释中所示),则SelectedItem
和Keyboard.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
wpf中,当DataGrid.ItemsSource与ObservableCollection绑定后,值变化时,DataGrid如何刷新?