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 が null の場合に項目があることを確認しました。

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

もう 1 つ注目すべき点は、ItemsControl に 8 つのリストボックス項目があることです。ItemContainerGenerator のステータスは * Container Generated *と表示されます

ItemsContainer Thoughts を返さない理由がわかりません??

4

1 に答える 1

4

仮想化とは、リストボックス項目が表示されている場合にのみ生成されることを意味します。したがって、ItemContainerGenerator を使用して、生成されていない (表示されていない) リストボックス項目を取得することはできません。

リストボックス項目が直接必要ですか? リストボックスはデータ駆動型のようですので、データを直接操作してください。

于 2011-04-20T13:30:50.993 に答える