4

我有一个包含几个项目的列表框,直到没有滚动条出现之前一切都很好,但是一旦滚动条出现,ItemContainerGenerator 就会返回 null。

我阅读了一些博客,发现可能是因为虚拟化堆栈面板。如果我禁用它,那么它可能会起作用,但在我的情况下,它会使列表框过于繁重且效率降低。

这是列表框的代码:

 <ListBox x:Name="EventListBox"
          DockPanel.Dock="Top"
          Margin="5,5,5,5"
          FocusVisualStyle="{x:Null}"
          ItemsSource="{Binding EventModelViewCollectionView}"
          Style="{StaticResource DefaultListBoxStyle}"
          ItemTemplate="{StaticResource EventTemplate}"
          SelectedItem="{Binding EventModelViewCollection.SelectedItem}"
          ScrollViewer.HorizontalScrollBarVisibility="Disabled"
          ScrollViewer.VerticalScrollBarVisibility="Auto"
          ScrollViewer.CanContentScroll="True"
          ScrollViewer.IsDeferredScrollingEnabled="False"
          ScrollViewer.ScrollChanged="EventScrollViewer_ScrollChanged"
          IsSynchronizedWithCurrentItem="True"
          Loaded="ListBox_Unloaded">

这将返回 null。

这里 firstContainer 应该是第一个列表框元素。我验证了 itemsControl 是正确的,并且当 firstContainer 为空时它有项目。

DependencyObject firstContainer = itemsControl.ItemContainerGenerator.ContainerFromIndex(0);

另一件值得注意的事情:我看到 ItemsControl 中有 8 个列表框项。ItemContainerGenerator 状态显示 *容器已生成 *

不知道为什么它不返回 ItemsContainer Thoughts ??

4

1 回答 1

4

虚拟化意味着 listboxitems 只有在可见时才会生成。因此,您不能使用 ItemContainerGenerator 来获取未生成(不可见)的列表框项目。

你真的需要直接的列表框项目吗?看起来您的列表框是数据驱动的,因此直接使用数据。

于 2011-04-20T13:30:50.993 回答