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();
            }
        }
    }

ListBox.ItemContainerGenerator.ContainerFromIndex Returns nu

我认为您使用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。