2011-04-20 54 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