当向列表框中添加项目时,如何冻结列表框项目?

10
我们有一个ListBox,其中包含许多项。通过ObservableCollection将项插入ListBox中。其中一些项可以在ListBox中直接编辑。但是,如果在编辑的项索引之前添加一个项目,则整个ListBox的内容会向下移动。
我们想要做的是:如果一个项处于编辑模式,我们希望在屏幕上冻结其位置。如果向集合中添加项目并且围绕该项目的UI发生更改,则没有问题。但是,项目的位置应始终保持在屏幕上不变。
到目前为止,我唯一能够做的事情就是附加到ScrollChanged事件,并且最多使用BringIntoView或ScrollIntoView方法来确保该项始终在UI中的某个地方显示,但是我无法锁定其位置。
有人做过类似的事情并能提供帮助吗?

我不想把这个作为答案呈现出来,但如果我必须这样做(并且您正在使用数据绑定),我会尝试在编辑项目时打破数据绑定,然后在编辑完成后再次设置数据上下文。 - Dave
5个回答

1
我认为以下内容可以解决你的问题:
  1. 进入编辑模式时,保持对正在编辑对象的引用、它在列表框中的索引以及 ScrollViewer 的 HorizontalOffset。

  2. 在 ObservableCollection.CollectionChanged 事件处理程序中查找您要编辑的对象的新索引,如果索引已更改,请将编辑的项与现在取代它的项进行交换(或者如果要保留某种顺序,则使用其他逻辑)。然后,如果 ScrollViewer.HorizontalOffset 已更改,请将其移回所述偏移量。

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

希望这可以帮助您解决问题。


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 

非常有趣。我明天会尝试一下并回报它的工作情况。谢谢。 - Szymon Rozga

0

问题是你不想让它移动吗?还是你已经通过索引号引用了该项,而索引的变化在应用更改时会导致其他问题(例如将更改应用于现在位于先前索引处的项目)?

如果问题是索引的变化在代码中引起问题,那么我建议停止使用索引,而是获取对象的引用。稍后,如果你发现需要,你总是可以获取该项的索引。


0

可以考虑切换到ListView,使用EnsureVisible吗?


0
如果冻结列表框的其余部分是可行的选项。这样添加的项目在编辑完成或退出后才出现,那么您可以尝试使用BeginUpdateEndUpdate来停止重新绘制ListBox。不过我不确定这会对您的编辑过程产生什么影响。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接