2011-10-04 60 views
2

的ItemsControlVirtualizingStackPanel作为项目小组是这样的:VirtualizingStackPanel不清除文本框的文本在ItemTemplate

<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> 

我设置作为ItemsSource 100.000元素的集合,并获得非常好的表现。除了一件事以外,一切都很好。当我在其中一个文本框中输入文本,然后开始滚动时,我看到该文本出现在整个列表中的任何地方!

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

+0

我对datagird中的单选按钮有同样的问题,并通过为每个单元添加单独的编辑模板来解决它。感谢@Rachel,现在很清楚如何解决这类问题 –

回答

6

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

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

如果您在文本框#1中输入文本,并且TextBox.Text未绑定任何内容,则文本将始终显示,因为该控件正在重新使用。如果你将TextBox.Text绑定为一个值,那么当你滚动时DataContext将会改变,这将取代显示的文本。

+0

谢谢,现在已经足够清楚了! – EvAlex

0

不知道如何直接关闭VirtualizingStackPanel中的回收功能,但这是ListBox中的语法。我会张贴评论,但我想格式化的代码。

<ListBox VirtualizingStackPanel.VirtualizationMode="Standard" /> 
+0

您仍然可以在注释中添加代码行,但在代码块周围添加一个“反引号”,尽管它不会着色或让您执行多行代码 – Rachel

+0

什么是反引号? – Paparazzi

+0

这是在标准美式键盘上的[Tab]键上方的关键。它与Tilde('〜')共享密钥。 – Rachel