Wpf 虚拟化StackPanel不';t清除ItemTemplate中文本框的文本
我有ItemsControl和virtualzingstackpanel作为项目面板,如下所示:Wpf 虚拟化StackPanel不';t清除ItemTemplate中文本框的文本,wpf,silverlight,virtualizingstackpanel,Wpf,Silverlight,Virtualizingstackpanel,我有ItemsControl和virtualzingstackpanel作为项目面板,如下所示: <ItemsControl Style="{StaticResource ItemsControl}" Name="itemsControl" Margin="0,100,0,0" HorizontalAlignment="Stretch" Height="80"> <ItemsControl.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>
我将一个包含100000个元素的集合设置为ItemsSource,并获得了非常好的性能。除了一件事,一切都很好。当我在其中一个文本框中输入文本,然后开始滚动时,我看到该文本在整个列表中随处可见
我了解虚拟化StackPanel的功能。它不断加载元素,当我们滚动时,这些元素变得可见。我了解它的虚拟化技术的某些方面,但我不知道如何理解这种奇怪的行为。我在WPF/Silverlight虚拟化上找不到好的文档,因此,请解释一下发生了什么事
virtualzingstackpanel
实际上并没有连续加载元素。相反,它重新使用现有的元素(控件),并简单地替换它们后面的DataContext
因此,如果您有一个包含100000个项目的虚拟化StackPanel
,并且一次只能看到10个项目,那么它通常会渲染大约14个项目(滚动缓冲区的额外项目)。当您滚动时,这14个控件背后的DataContext会发生更改,但实际控件本身永远不会被替换
如果您在TextBox#1中输入文本之类的操作,并且
TextBox.Text
未绑定到任何内容,则文本将始终显示,因为控件正在被重复使用。如果将TextBox.Text
绑定到一个值,则当您滚动时,DataContext将更改,这将替换显示的文本。不确定如何在VirtualzingStackPanel中直接关闭回收,但这是列表框中的语法。我本想发表评论,但我想要格式化的代码
<ListBox VirtualizingStackPanel.VirtualizationMode="Standard" />
datagird中的单选按钮也有同样的问题,通过为每个单元格添加单独的编辑模板解决了这个问题。多亏了@Rachel,现在我们清楚地知道了如何解决这类问题。您仍然可以通过在代码块周围添加反勾来在注释中添加代码行,尽管它不会给代码块上色或让您执行多行操作。这是标准美国键盘上[Tab]键上方的键。它与Tilde(~
)共享一个密钥。