对于我的Windows Phone 8应用程序,我有一个如下所示的Listbox元素; 当我在AppBar上按多选图标时,我想在DataTemplate中显示复选框。 因此用户可以对项目进行多选。
我在此列表框上绑定了50个元素,并始终在索引11 ItemContainerGenerator.ContainerFromIndex 返回null,以及列表其余部分的其他一些项目。所以50个中的10个项目返回为null。
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();
}
}
}
答案 0 :(得分:2)
我认为你错误地使用了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。