VirtualizingStackPanel不会清除ItemTemplate中TextBoxes的文本

时间:2011-10-04 14:06:55

标签: wpf silverlight virtualizingstackpanel

我将 ItemsControl VirtualizingStackPanel 作为项目面板,如下所示:

<ItemsControl Style="{StaticResource ItemsControl}" Name="itemsControl" 
              Margin="0,100,0,0" HorizontalAlignment="Stretch" Height="80">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <TextBox  />                    
            </DataTemplate>
        </ItemsControl.ItemTemplate>
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>                    
                <VirtualizingStackPanel Orientation="Horizontal" />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
</ItemsControl>

风格如下:

<Style x:Key="ItemsControl" TargetType="ItemsControl">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ItemsControl">
                <ScrollViewer VerticalScrollBarVisibility="Hidden" 
                              HorizontalScrollBarVisibility="Visible">
                    <ItemsPresenter />
                </ScrollViewer>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

我将一个拥有100.000个元素的集合设置为 ItemsSource ,并获得非常好的表现。除了一件事,一切都很好。当我在其中一个文本框中输入文本然后开始滚动时,我发现该文本在整个列表中随处可见!

我理解 VirtualizingStackPanel 的作用。它会不断加载在滚动时变得可见的元素。我理解它的虚拟化技术的一些方面,但我不知道如何理解这种奇怪的行为。我没能找到关于WPF / Silverlight虚拟化的好文档,所以,请解释一下发生了什么

2 个答案:

答案 0 :(得分:6)

VirtualizingStackPanel实际上并没有持续加载元素。相反,它重用现有元素(控件)并简单地替换它们后面的DataContext。

因此,如果您有一个包含100,000个项目的VirtualizingStackPanel,并且一次只能看到10个项目,那么它通常会呈现大约14个项目(滚动缓冲区的额外项目)。滚动时,这14个控件后面的DataContext会被更改,但实际控件本身永远不会被替换。

如果您在TextBox#1中输入Text,并且TextBox.Text未绑定任何内容,则Text将始终显示,因为控件正在重新使用。如果将TextBox.Text绑定到某个值,则滚动时DataContext将更改,这将替换显示的文本。

答案 1 :(得分:0)

不确定如何直接在VirtualizingStackPanel中关闭回收,但这是ListBox中的语法。我会发布评论,但我想要格式化代码。

   <ListBox VirtualizingStackPanel.VirtualizationMode="Standard" />