2010-11-29 26 views
2

我有一个列表视图的UI虚拟化与数百个元素的项目可以公开一个Visibility属性的问题。ListView,ListViewItems和Virtualization

不幸的是,虚拟化无法识别正确的可见性,并根据在滚动位置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> 

回答

2

虚拟化的一点是,UI可以无需审查集合中的每一个项目,正确呈现?但是你想要的结果依赖于这样做 - 滚动条不能准确地计算出拇指的大小,而不知道有多少项目可见,并且为了做到这一点,必须查看每个项目。启动虚拟化后,滚动条不会查看每个项目,只会将集合中的项目数量用作估计值。

什么可能会更好,而不是折叠您不希望看到的项目,而是将其从项目源中移除。使用CollectionView并过滤掉VisibilityVisibility.Collapsed的项目。您仍然需要花费访问基本集合中的每个项目的开销,以确定它是否应该出现在视图中,但是如果在UI中呈现的集合中的项目上游执行该操作,它可能会快很多。

相关问题