为清楚起见编辑:
我的应用程序中有 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,当测量时,试图测量它的所有项目?