2010-11-29 56 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中呈現的集合中的項目上游執行該操作,它可能會快很多。