ListBox.ItemContainerGenerator.ContainerFromIndex返回null

时间:2014-10-22 02:35:57

标签: c# windows-phone-8 listbox

对于我的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();
            }
        }
    }

1 个答案:

答案 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。