ListBox.ItemContainerGenerator.ContainerFromIndex Returns nu
本文关键字:nu Returns ContainerFromIndex ItemContainerGenerator ListBox | 更新日期: 2023-09-27 18:27:32
对于我的Windows Phone 8应用程序,我有一个Listbox元素,如下所示;当我按下AppBar上的多选图标时,我想在DataTemplate中显示复选框。因此,用户可以对项目进行多选。
我有50个元素绑定在这个列表框上,并且总是在索引11ItemContainerGenerator处。ContainerFromIndex返回null,加上列表其余部分的一些其他项。因此,在50个项目中,大约有10个项目返回为空。
WPF有一些答案,比如应用Dispatcher.BeginInvoke或UpdateLayout、ScrollIntoView,但都不起作用。
另一方面,如果我滚动列表,然后按下AppBar图标,它会很好地工作。但用户可以在数据绑定后直接按下图标,他们不会看到一些复选框。
对于Windows Phone 8,是否有解决此问题的方法?
<ListBox Name="ResultListBox" ItemsSource="{Binding}"
SelectionChanged="ResultListBox_OnSelectionChanged">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Margin="0,0,0,10" Orientation="Horizontal">
<StackPanel Orientation="Horizontal">
<CheckBox Name="CheckBox" Visibility="Collapsed">
</CheckBox>
<Image Source="{Binding url}"
Width="125"
Height="125"
VerticalAlignment="Top"
Margin="0,0,5,0"></Image>
</StackPanel>
<StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding title}"
VerticalAlignment="Top"
FontFamily="Portable User Interface"></TextBlock>
</StackPanel>
<StackPanel>
<TextBlock Text="{Binding description}"
FontFamily="Portable User Interface"></TextBlock>
</StackPanel>
</StackPanel>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
void appBarButtonSelect_Click(object sender, EventArgs e)
{
//Dispatcher.BeginInvoke(delegate
//{
//});
for (int i = 0; i < ResultListBox.Items.Count; i++)
{
//ResultListBox.UpdateLayout();
//ResultListBox.ScrollIntoView(i);
DependencyObject item = ResultListBox.ItemContainerGenerator.ContainerFromIndex(i);
if (item != null)
{
CheckBox checkBox = FindFirstElementInVisualTree<CheckBox>(item);
if (checkBox != null)
{
checkBox.Visibility = Visibility.Visible;
}
}
else
{
Debugger.Break();
}
}
}
我认为您使用ScrollIntoView+UpdateLayout不正确,
当它需要一个与ItemsSource
直接相关的对象时,您正在向它传递一个索引
因此,如果您的ItemsSource是ObservableCollection
,请执行以下操作:
object o = ((ObservableCollection<sample_model>)this.myListBox.ItemsSource)[INDEX];
this.myListBox.ScrollIntoView(o); // call this first
this.myListBox.UpdateLayout(); // call this second
那么您的ItemContainerGenerator.ContainerFromIndex(INDEX)
将不会为NULL。