0

为清楚起见编辑:

我的应用程序中有 2 个 ListView。第一个包含一个List<KeyPair<String,List<Elements>>。列表中项目的显示被模板化为仅显示键(字符串)。当用户在此列表中选择一个项目 (SelectionChanged) 时,它会将我的第二个 ListView 的 ItemSource 更改为 Keypair 的 Value。

这被放置在列宽为 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 是一个小型文本块,其中 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,当测量时,试图测量它的所有项目?

4

1 回答 1

0

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

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

于 2012-03-02T13:44:51.960 回答