У меня только что была та же проблема с ItemContainerGenerator.ContainerFromItem () и ItemContainerGenerator.ContainerFromIndex (), возвращая ноль для элементов, которые явно присутствовали в списке. Декартель был прав, но мне пришлось немного покопаться, чтобы понять, что именно он имел в виду. Вот разбивка, чтобы спасти следующего парня / девчонку.
Короче говоря, ListBoxItems уничтожаются, если они не видны. Следовательно, ContainerFromItem () и ContainerFromIndex () возвращают null, поскольку ListBoxItems не существует. Это, очевидно, функция экономии памяти / производительности, подробно описанная здесь: http://blogs.msdn.com/b/oren/archive/2010/11/08/wp7-silverlight-perf-demo-1-virtualizingstackpanel-vs-stackpanel-as-a-listbox-itemspanel.aspx
Пустой код <ListBox.ItemsPanel>
- это то, что отключает виртуализацию. Пример кода, который исправил проблему для меня:
Шаблон данных:
<phone:PhoneApplicationPage.Resources>
<DataTemplate x:Key="StoryViewModelTemplate">
<StackPanel>
<your datatemplated stuff here/>
</StackPanel>
</DataTemplate>
</phone:PhoneApplicationPage.Resources>
Основной корпус:
<Grid x:Name="ContentPanel">
<ListBox Name="lbResults" ItemsSource="{Binding SearchResults}" ItemTemplate="{StaticResource StoryViewModelTemplate}">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel>
</StackPanel>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
</Grid>