当项目数超过400项时,Listview无法显示列表项的文本

时间:2014-08-25 02:26:23

标签: wpf winrt-xaml windows-8.1 windows-phone-8.1

我观察到,当项目数超过400项时,我的应用程序中的Listview无法显示listview项目的文本。

我的猜测是这是手机的内存问题,而不是带有更大设备的模式。

我假设我只需要添加我的listview项目源所基于的项目的一小部分。

管理负责显示大量数据的列表视图的最佳方法是什么?

这是我的XAML:

<ListView x:Name="ContactList" ScrollViewer.VerticalScrollBarVisibility="Visible"
         attachedProperties:CategoryHelper.Category="{Binding SelectedCategory, Mode=TwoWay}"
         ItemsSource="{Binding SelectedCategory.Contacts}"
         VirtualizingStackPanel.VirtualizationMode="Recycling" 
         SelectedItem="{Binding SelectedContact, Mode=TwoWay}"
         HorizontalContentAlignment="Left"
         Margin="58,175,0,0" 
         Height="425"
         Width="425"
         Background="Transparent" Foreground="#FF333747" VerticalAlignment="Top" Canvas.ZIndex="99" HorizontalAlignment="Left" >

    <ListView.Template>
        <ControlTemplate>
            <ScrollViewer>
                <ItemsPresenter VirtualizingStackPanel.VirtualizationMode="{TemplateBinding VirtualizingStackPanel.VirtualizationMode}" />
            </ScrollViewer>
        </ControlTemplate>
    </ListView.Template>

    <ListView.ItemsPanel>
        <ItemsPanelTemplate>
            <ItemsStackPanel/>
        </ItemsPanelTemplate>
    </ListView.ItemsPanel>

    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="FontSize" Value="26" />
            <Setter Property="Margin" Value="0,10" />
            <Setter Property="Foreground" Value="#FF333747" />
        </Style>
    </ListView.ItemContainerStyle>

    <ListView.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <CheckBox Style="{StaticResource CheckBoxStyle1}"
                          Loaded="CheckBox_Loaded"
                          Visibility="{Binding ElementName=grid, Path=DataContext.BroadcastActivated, Converter={StaticResource BoolToVisibilityConverter}, Mode=TwoWay}"
                          Margin="0,-8" BorderBrush="#FF4E58BC" Checked="ContactChecked" Unchecked="ContactUnchecked">
                </CheckBox>

                <TextBlock Text="{Binding DisplayName}">
                    <Interactivity:Interaction.Behaviors>
                        <Core:EventTriggerBehavior EventName="Holding">
                            <behaviors:MoveContactAction />
                        </Core:EventTriggerBehavior>
                    </Interactivity:Interaction.Behaviors>

                    <FlyoutBase.AttachedFlyout>
                        <MenuFlyout>
                            <MenuFlyoutItem Text="Family" Command="{Binding ElementName=grid, Path=DataContext.MoveCommand}" CommandParameter="{Binding RelativeSource={RelativeSource Self}, Path=Text}" />
                            <MenuFlyoutItem Text="Friend" Command="{Binding ElementName=grid, Path=DataContext.MoveCommand}" CommandParameter="{Binding RelativeSource={RelativeSource Self}, Path=Text}" />
                            <MenuFlyoutItem Text="Business" Command="{Binding ElementName=grid, Path=DataContext.MoveCommand}" CommandParameter="{Binding RelativeSource={RelativeSource Self}, Path=Text}" />
                            <MenuFlyoutItem Text="Others" Command="{Binding ElementName=grid, Path=DataContext.MoveCommand}" CommandParameter="{Binding RelativeSource={RelativeSource Self}, Path=Text}" />
                        </MenuFlyout>
                    </FlyoutBase.AttachedFlyout>
                </TextBlock>
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

更新 我现在可以在Listview中显示大量项目。

但是,如果没有观察到未显示的相同问题,我将无法应用DataTemplate。

这有效:

<ListView x:Name="ContactList" ItemsSource="{Binding SelectedCategory.Contacts}"
            Height="425"
            Width="425"
            Margin="58,175,0,0"  Canvas.ZIndex="99"
            Background="Transparent" Foreground="#FF333747" 
            VerticalAlignment="Top" HorizontalAlignment="Left">

    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>

    <ItemsControl.Template>
        <ControlTemplate TargetType="ItemsControl">
            <Border>
                <ScrollViewer>
                    <ItemsPresenter/>
                </ScrollViewer>
            </Border>
        </ControlTemplate>
    </ItemsControl.Template>

    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="Hello Wworld" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ListView>

这不是

<ListView x:Name="ContactList" ItemsSource="{Binding SelectedCategory.Contacts}"
            Height="425"
            Width="425"
            Margin="58,175,0,0"  Canvas.ZIndex="99"
            Background="Transparent" Foreground="#FF333747" 
            VerticalAlignment="Top" HorizontalAlignment="Left">

    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>

    <ItemsControl.Template>
        <ControlTemplate TargetType="ItemsControl">
            <Border>
                <ScrollViewer>
                    <ItemsPresenter/>
                </ScrollViewer>
            </Border>
        </ControlTemplate>
    </ItemsControl.Template>

    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding DisplayName}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ListView>

一旦应用绑定,使用数据模板显示列表视图项似乎失败。 我该如何解决这个问题?

3 个答案:

答案 0 :(得分:0)

是的,你不能将它们全部留在内存中。 你可以使用虚拟化。 这是链接:http://msdn.microsoft.com/en-us/library/system.windows.controls.virtualizingstackpanel.isvirtualizing.aspx

答案 1 :(得分:0)

请记住,这是一部手机,为什么您要在列表中首先选择400多个项目?想一想用户将如何处理这些数据 如果你有超过400个项目,那么你应该有一些选择来缩小它们。也许你可以拥有结果“页面”,并将它们捆绑在一个易于消化的数字中,无论是对于手机,还是更重要的是用户。

话虽如此,除了 Rang 的回答之外,您还可以尝试为应用程序分配更多内存。看看this post,但具体来说:

<FunctionalCapabilities>
  <FunctionalCapability Name="ID_FUNCCAP_EXTEND_MEM"/>
</FunctionalCapabilities>

答案 2 :(得分:0)

我的列表显示了几个空字符串的项目。

由于此列表按升序排序,显示空文本的项目显示在列表的开头,而其他项目确实存在但不在滚动查看器的视口中。

结果我这样做了:

if (string.IsNullOrWhiteSpace(contact.DisplayName))
{
    continue;
}