【问题标题】:Listbox keeps repeating first items列表框不断重复第一项
【发布时间】:2016-06-07 15:37:55
【问题描述】:

我有一个加载项目的简单列表框(在我的测试用例 135 中)。 我记录了所有加载项目的 ID,它们都有一个唯一的 ID。列表框数据模板是一个用户控件,所以在用户控件中我还记录了 ID 以查看加载了哪些。

现在是它开始出错的地方,它只加载大约前 10 个项目(我认为是最初可见的),然后一遍又一遍地重复这些第一个项目。因此,我有 135 个对象,而不是 135 个唯一对象,它们是前 10 个左右加载的对象之一。

您可以在此处查看日志记录(还有很多 ID 不可见):

在用户控件 ID 行之后,这是它加载的唯一 ID,并不断循环这 10 个 ID,直到列表框中有 135 个项目。

这是完整的页面代码

    <Style x:Key="ListBoxItemStyle1" TargetType="ListBoxItem">
        <Setter Property="HorizontalContentAlignment" Value="Stretch"/>

        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ListBoxItem">
                    <Border x:Name="LayoutRoot" BorderThickness="3">

                        <ContentControl x:Name="ContentContainer" 
                            VerticalContentAlignment="Top" 
                            HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"  
                            Margin="{TemplateBinding Padding}" 
                            Content="{TemplateBinding Content}" 
                            ContentTemplate="{TemplateBinding ContentTemplate}" 
                            Foreground="{TemplateBinding Foreground}" />
                    </Border>

                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Page.Resources>

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>
        <SearchBox x:Name="sbSearch" QuerySubmitted="sbSearch_QuerySubmitted" Margin="12,12,12,0"></SearchBox>


        <ListBox x:Name="lbResults" Grid.Row="1" ItemContainerStyle="{StaticResource ListBoxItemStyle1}" Background="{x:Null}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <userControls:WantlistItem Tag="{Binding}"></userControls:WantlistItem>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
</Grid>

我做错了什么?

Edit1:在主页加载列表框

    private void Page_Loaded(object sender, RoutedEventArgs e)
    {
        if(Variables.WantsAll == null) Helpers.GetWantList();
        foreach (var v in Variables.WantsAll)
        {
            Debug.WriteLine(v.id);
        }
        Debug.WriteLine("--- USER CONTROL ID's ---");
        lbResults.ItemsSource = Variables.WantsAll;


    }

在 UserControl Page_Loaded 我也在记录它们。

在此屏幕截图中,您可以看到我向下滚动,它开始再次重复相同的项目(有时它会搞砸,因为您可以看到第一个项目没有正确重复,它是不同的)。

请注意,在我添加了它打印出来的 ID 的名称前面,您可以看到它重复相同的 ID(例如绿色专辑:1301162),即使在我设置为 ItemsSource 的列表中它只存在一次(所有物品都是独一无二的)。

【问题讨论】:

  • 如何打印 ID?在哪个事件中哪个控制?
  • 我编辑了第一篇记录了 ID 的帖子。它发生在主页的 Page_Loaded 和用户控件中(即您在“--- USER CONTROL ID's ---”之后看到的那些)
  • 你能分享更多关于“Helpers.GetWantList()”和“Variables.WantsAll”的细节吗?它们是什么类型的?此外,您能否尝试一个简单的绑定测试,或将 lbResults.ItemsSource 分配给 List 或 IEnumerable。列表框确实使用了虚拟化,因此如果您的 WantsAll 对象没有正确实现 IEnumerable 会发生什么。
  • 可能是带有模板的东西。尝试对 ListBoxItem 使用标准模板
  • 您能分享一个minimal reproducible example 来重现您的问题吗?正如@AlexDrenea 所说,这可能与ListBox 的虚拟化有关。而here 是一个类似的案例可能会对你有所帮助。

标签: windows-10 uwp uwp-xaml


【解决方案1】:

Jay Zuo - MSFT 提供的评论提供了解决方案,this thread 的答案正好解决了我的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    • 2014-11-26
    • 1970-01-01
    相关资源
    最近更新 更多