ListView,ListViewItems和虚拟化

时间:2010-11-29 14:30:25

标签: wpf listview visibility

我遇到了ListView的UI虚拟化问题,其中有数百个元素可以公开Visibility属性。

不幸的是,虚拟化无法识别可见性,并且根据ViewPort中有多少项目(而不是ViewPort中未折叠的项目数量)使滚动条更小或更大。

有没有办法在不关闭虚拟化的情况下避免这个问题?

请参阅附带的示例:

<ListView VerticalAlignment="Stretch" 
          Name="ListViewControl" 
          HorizontalAlignment="Stretch" 
          ItemsSource="{Binding Movies}" 
          ScrollViewer.VerticalScrollBarVisibility="Visible" 
          SelectedItem="{Binding MovieSelected, Mode=OneWayToSource}">
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <EventSetter Event="MouseDoubleClick" Handler="ItemClicked" />
            <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
            <Setter Property="Visibility" Value="{Binding Visibility}"/>
        </Style>
    </ListView.ItemContainerStyle>
    <ListView.ItemTemplate>
        <DataTemplate>
            <Grid HorizontalAlignment="Stretch">

            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

1 个答案:

答案 0 :(得分:2)

虚拟化的关键在于UI可以呈现而无需检查集合中的每个项目,对吧?但是你想要的结果取决于这样做 - 滚动条无法准确计算拇指的大小而不知道有多少项可见,为了做到这一点,它必须查看每个项目。当您打开虚拟化时,滚动条不会查看每个项目,只会使用集合中的项目数作为估算值​​。

什么可能更好,而不是折叠您不想看到的项目,是从项目源中删除它们。使用CollectionView并过滤掉VisibilityVisibility.Collapsed的项目。您仍然需要花费访问基本集合中的每个项目以确定它是否应该出现在视图中的成本,但如果在集合中的项目的上游完成实际在UI中呈现,则可能会更快。 / p>