什么会导致虚拟化ListView有时生成所有项目?

时间:2012-03-01 14:43:32

标签: c# wpf listview virtualizingstackpanel

为清晰起见,已编辑:

我有2个ListView我的应用程序。第一个包含List<密钥对与LT;字符串,列表<元素>取代。列表中项目的显示是模板化的,仅显示Key(String)。当用户选择此列表中的项目(SelectionChanged)时,它会将我的第二个ListView的ItemSource更改为Keypair的值。

将其放置在Grid宽度为Auto的Grid中。

<ListView ItemsSource="{Binding Path=FunctionIndex.Index}"
          Name="completeFunctionIndexView"        
          Style="{StaticResource SearchListStyle}"
          SelectionChanged="functionIndexView_SelectionChanged" />

<ListView Name="SearchResults" 
          VirtualizingStackPanel.IsVirtualizing="True"
          VirtualizingStackPanel.VirtualizationMode="Recycling">
              <ListView.View>
                 <GridView >
                    <GridViewColumn 
                                 CellTemplate="{StaticResource ElementLV}"
                                 Width="Auto"/>
                 </GridView>
              </ListView.View>
           </ListView>

Style SearchListStyle只会显示一个显示Key的TextBlock(因为它包含KeyPairs)。 ElementLV是一个小的Text块,其中Runs绑定到我的元素的不同属性和ToString值。

private void functionIndexView_SelectionChanged(object sender, SelectionChangedEventArgs e)
     {
     //This supposes we want to support a "multiple selection search"
     //for now this isn't implemented
     List<Element> Results = new List<Element>();

     foreach (KeyValuePair<String, List<Element>> item in e.AddedItems)
        {
        Results = item.Value;
        break;
        }

     SearchResults.ItemsSource = Results;
     }

可以在SearchResults列表视图中显示的这些列表可以包含大量元素(100k +)。我已将IsVirtualizing放在第二个列表视图中,并且大部分时间它都像魅力一样。

但有时候,我不能完全理解导致它的原因(点击选择项目的速度太快?)应用程序决定它必须生成列表中的所有项目(显然不需要)。 ..

有人能指出我正确的方向吗?是否有理由要求SearchResults决定要求生成所有项目?

是否可以链接到项目的宽度和SearchResults ListView,在测量时,尝试测量其所有项目?

1 个答案:

答案 0 :(得分:0)

我发现导致我的List生成所有元素的情况。它与ListView有关,没有指定的宽度,并且在带有自动的容器(带有自动的网格列)中作为宽度。在某些情况下我似乎还不确定,ListView会尝试生成所有元素来测量它们的宽度而不是仅使用当前可见的元素。

我认为它并不总是这样,但在我的应用程序的这种特殊情况下,现在它确实......