2010-03-11 81 views
10

我们有一个列表框,其中包含多个项目。项目通过ObservableCollection插入到列表框中。其中一些项目可以在列表框中进行编辑。但是,如果在编辑的项目索引的索引<处添加项目,则列表框的整个内容向下移动。正在添加项目时冻结listboxitem

我们想做的事情如下:如果一个项目处于编辑模式,我们想冻结它在屏幕上的位置。如果项目被添加到集合中并且项目周围的用户界面发生更改,那就好了。但是该项目的位置应该在屏幕上保持不变。

我已经能够迄今为止做的唯一的事情就是连接到ScrollChanged事件,顶多,使用BringIntoView或ScrollIntoView方法,以确保该项目始终在UI显示的地方,但我无法锁定其位置。

有没有人做过这样的事情,并帮助?

+0

我并不想提出这是一个答案,但第一件事,如果我不得不这样做(如果您正在使用数据绑定)被打破了数据绑定时,项编辑我会尝试,并设定编辑完成后再次返回datacontext。 – Dave 2010-06-27 05:10:23

回答

0

您可以始终强制将项目添加到收藏的最后。否则,我认为你在滚动ScrollViewer的时候正处于正确的轨道上。当进入'编辑模式'时,跟踪当前的水平偏移量。


ScrollViewer sv = listBox.GetScrollViewer(); 
double indexPos = sv.HorizontalOffset; 

但是,我认为你最好附加到ObservableCollection.CollectionChanged事件。事件触发时,检查新值是否已插入到“编辑模式”项目的上方。如果是,则运行以下代码。


ScrollViewer sv = listBox.GetScrollViewer(); 
sv.ScrollToHorizontalOffset(indexPos+1); // This will obviously require an offset 
+0

非常有趣。我明天会试一试,并报告它是如何工作的。谢谢。 – 2010-03-12 01:18:52

0

问题是你根本不希望它移动?或者是您通过其索引号引用了所述项目的问题,并且在应用更改时(如将其应用于现在位于上一索引的项目),索引更改会导致其他问题?

如果问题是索引更改导致代码出现问题,那么我将停止使用索引,而是获取对该对象的引用。稍后,如果您发现需要,可随时获取该物品的索引。

1

我认为有以下将解决你的问题:

  1. 当进入编辑模式,保留到您正在编辑的对象,它在列表框中指数和ScrollViewer中的Horizo​​ntalOffset参考。

  2. 在ObservableCollection.CollectionChanged事件的处理程序中,如果索引已更改,请找到您编辑的对象的新索引,然后将编辑后的项目与正在放置的项目交换(如果您想保留其他逻辑一定的顺序)。然后,如果ScrollViewer.Horizo​​ntalOffset更改,将其移回所述偏移量。

这将确保您正在编辑的项目始终保持在列表中和用户界面中完全相同的位置。

希望这能帮助你。

0

切换到ListView并使用EnsureVisible是否可行?

0

如果冻结列表框的其余部分是一个可行的选项。使得按照被添加的条目不出现,直到编辑完成之后,或者逃脱后,那么你可以尝试使用BeginUpdateEndUpdate从被重新粉刷停止列表框。我不确定这将如何影响您的编辑过程。