ItemsSource为IList时的ItemsControl行为

时间:2012-07-23 07:17:17

标签: wpf virtualization itemscontrol ilist itemssource

我正在尝试为分层控件实现虚拟化集合,类似于this article中提供的常规控件的集合控件。

文章中提出的解决方案在很大程度上依赖于以下行为(来自文章):

  

ItemsControl绑定到IList实现时,而不是。{   一个IEnumerable实现,它不会枚举整个列表,   而只是访问显示所需的项目。它使用了   Count属性来确定集合的大小,大概是为了   设置滚动范围。然后它将遍历屏幕   使用列表索引器的项目。因此,可以创建IList   可以报​​告有大量项目,但实际上只有   在需要时检索项目。

我发现虽然ListBox有这种行为,但TreeView(也是ItemsControl)的行为并不像这样,所有项目总是被请求,无论是否或不是它们会显示在屏幕上。

那么,这是针对ListBox而不是针对每个ItemsControl的特定行为,还是WPF TreeView中的错误?

我也无法在MSDN上找到任何关于此行为的提及,所以如果有人发现它记录在任何我想知道的地方。

1 个答案:

答案 0 :(得分:0)

虚拟化ItemsControl除了使用VirtualizingStackPanel或设置VirtualizingStackPanel.IsVirtualizing="True"

之外,还有其他方法

以下是所需代码的重要部分,但请参阅this question以获得更完整的答案

<ItemsControl
    VirtualizingStackPanel.IsVirtualizing="True" <!-- needed -->
    ScrollViewer.CanContentScroll="True" <!-- needed -->
    ... >
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel /> <!-- needed -->
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.Template>
        <ControlTemplate>
            <ScrollViewer>  <!-- needed -->
                <ItemsPresenter  />
            </ScrollViewer>
        </ControlTemplate>
    </ItemsControl.Template>
</ItemsControl>