2013-05-01 69 views
9

香港专业教育学院在这已经工作了几天,但不能似乎想出了一个解决方案保持对焦/的SelectedItem的DataGrid的ItemsSource更改后

我有代码上刷新每隔几秒钟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与结果,那么SelectedItemKeyboard.FocusedElement保持稳住,直到上面的代码的结束,但是这个代码的结束和下一个节拍它们都变成Nothing

,如果我与ObservableCollection然后SelectedItem去介于两者之间,我清除收集一旦丢失, Keyboard.FocusedElement只会在滴答声之间丢失。虽然的SelectedItem可以在这里保留有一个临时的后盾变量

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

,是的,我知道, ObservableCollections未被“制造”重置。事实上,我不是真的有兴趣使用一个。它只是有一个保留SelectedItem

P.S.我也尝试过关注几个事件(OnItemsSourceChanged,SourceUpdated ...),但他们没有在正确的时间开除,或者根本没有开火

有什么想法?

ID真正最欣赏

谢谢

+0

检查此 - http://stackoverflow.com/questions/12808479/updating-listbox-without-losing-selected-item-wpf – user1221765 2013-05-27 10:18:23

+1

谢谢,在没有人回答这里,我没有在MSDN发布,并得到了一个很好的回答,现在它的工作已经够好了。你设置的链接没有任何消息,我也考虑过将记录1更新为1,但还没有得到它。无论如何感谢您的兴趣! – 2013-05-28 06:52:35

+0

你好Yisman,你可以请发布链接,我可以看到解决方案。它也会帮助我学习。谢谢:) – user1221765 2013-05-28 07:59:06

回答

0

你最好的选择是:

当用户进行选择,节约指数或一个变量的当前selectedItem属性。

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

0

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

+0

嗨。最后,我最终只改变了在db中实际更改的thos记录的属性。那就是诀窍。不管怎么说,还是要谢谢你。 – 2016-12-18 08:17:37

1

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

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

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

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

此外,在我看来,完全替换列表将导致其他问题。如果用户在DataGrid单元格中键入内容并替换它们下面的列表,则它们将失去编辑。

+0

thnaks。最后我建立了一个'ObservableCOllection'。这成为项目源,然后我更新observablecollection中的单个属性和所有罚款。谢谢! – 2017-02-24 08:44:40

相关问题