2011-04-20 38 views
4

我有一个列表框有几个项目,到时候没有滚动条上出现的一切ItemContainerGenerator返回null顺利完美罚款,但一旦谈到滚动然后ItemContainerGenerator返回null。列表框即使列表已物品

我读了一些博客,发现它可能是因为vertualization的StackPanel的。如果我禁用,那么它可能会工作,但在我的情况下,它会使列表框太重,效率不高。

这里是列表框代码:

<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为null时它有项目。

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

一个相当多注意到的事情: 我看到这儿有8个列表框项的ItemsControl。 ItemContainerGenerator状态是* 集装箱生成*

不知道为什么它没有返回ItemsContainer 思考?

+0

我已经通过以下链接:http://drwpf.com/blog/2008/07/20/itemscontrol-g-is-for-generator/ – Rohit 2011-04-20 11:45:21

回答

4

虚拟化意味着listboxitems只得到如果可见产生。因此,您无法使用ItemContainerGenerator获取未生成(不可见)列表框项目。

你真的需要直接在列表框的项目?它看起来像你的列表框是数据驱动的,所以直接使用数据。

+0

我只是要回答同样的事情你说。 :) .. 嗯,我确实需要提供自定义拖动〜拖放支持的项目。 – Rohit 2011-04-20 13:37:03

+0

虽然我能够解决上述问题,但在另一个问题中遇到了问题。在虚拟化为true的情况下,ScrollViewer - ViewPortHeight达到4.0(但是列表框的实际宽度比这大得多)。有没有解决这个问题? – Rohit 2011-04-20 13:38:40

+0

你是说你想知道所有列表框项目的总高度?如果列表框被虚拟化,那么您将不会知道,因为不会生成不可见的项目。如果所有物品都具有相同的高度,那么您可以获得1个物品*物品数量的高度。 – 2011-04-21 13:02:15