WPF 列表框虚拟化 - 如何将项目带入视图

WPF Listbox Virtualization - How to Bring Item Into View

我有一个列表框,我必须在其中启用虚拟化。然后我有一张地图,上面标有项目,需要具有让用户点击它们的功能。当他们单击某个项目时,我需要将该项目显示在列表框中。

问题是虚拟化。当我尝试抓取容器时,它 returns null,这是有道理的,但是正确的做法是什么?我已经尝试了一些方法,例如 UpdateLayout(),但我还没有找到答案。有什么想法吗?

var container = lstItems.ItemContainerGenerator.ContainerFromItem(clickedItem);
if (container != null)
{
     var exp = container.Descendants().OfType<Expander>().FirstOrDefault();
     if (exp != null)
     {
          exp.IsExpanded = true;
          exp.BringIntoView();
     }
}

ListBox 给你一个方法来做到这一点:

lstItems.ScrollIntoView(clickedItem);

如果您在已经显示的代码上方插入该行,那么 container 应该会给您一个实际的 ListBoxItem

但是,如果项目不在视图中,则可能尚未应用模板。您可以通过在搜索 Expander.

之前调用 container.UpdateLayout() 来解决这个问题

不过,您仍然需要 exp.BringIntoView() 调用,因为扩展器在扩展后可能会变得更大,而对 ScrollIntoView 的初始调用可能没有将它带到足够远的地方视口。或者,您可以再次调用 ScrollIntoView