【发布时间】: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...),但它们没有在正确的时间被触发,或者根本没有触发
有什么想法吗?
我真的很感激
谢谢
【问题讨论】:
-
谢谢,在没有人在这里回答之后,我确实在 msdn 上发了一个很好的答案,它现在工作得很好。您设置的链接没有消息,我也考虑过逐个更新记录。但还没有解决。无论如何感谢您的关注!
-
你好 Yisman,你能把链接发到我可以看到解决方案的地方吗?它也将帮助我学习。谢谢:)
-
在我看来,这里仅有的两种可能的解决方案是:A) 要么将 CurrentCell 信息保留在支持字段中,并在每次 ItemsSource 更改后重新设置它,或者 B) 不更改完全收集并“简单地”遍历项目,用它们的新值刷新它们。
标签: wpf datagrid focus refresh itemssource