ListBox ItemContainerGenerator возвращает ноль, даже если в списке есть элементы
У меня есть список с парой элементов, пока не появится полоса прокрутки, все будет отлично, но как только полоса прокрутки появится, ItemContainerGenerator вернет ноль.
Я прочитал некоторые блоги и обнаружил, что это может быть из-за вертикализации стека панели. Если я отключу это, то это может сработать, но в моем случае это сделает список слишком тяжелым и менее эффективным.
Вот код для списка:
<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">
Это возвращает ноль.
Здесь firstContainer должен быть первым элементом списка. Я проверил, что itemsControl является правильным, и у него есть элементы, когда firstContainer равен нулю.
DependencyObject firstContainer = itemsControl.ItemContainerGenerator.ContainerFromIndex(0);
Еще одна довольно заметная вещь: я увидел, что в ItemsControl есть 8 элементов списка. Состояние ItemContainerGenerator говорит * Контейнер создан *
Не знаю, почему это не возвращает ItemsContainer Мысли??
1 ответ
Виртуализация означает, что элементы listbox генерируются только если они видны. Таким образом, вы не можете использовать ItemContainerGenerator для получения не сгенерированных (не видимых) элементов списка.
Вы действительно нуждаетесь в элементе списка непосредственно? Похоже, ваш список работает с данными, поэтому работайте с данными напрямую.