我想在运行时更改 ListBox 的 ItemsPanelTemplate。
我有以下 XAML 允许我更改 ItemsPanelTemplate;但是有破坏 ScrollViewer 的不良副作用。
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:ie="clr-namespace:Microsoft.Expression.Interactivity.Core;assembly=Microsoft.Expression.Interactions"
...
<UserControl.Resources>
<ItemsPanelTemplate x:Key="StackPanelTemplate">
<VirtualizingStackPanel/>
</ItemsPanelTemplate>
<ItemsPanelTemplate x:Key="WrapPanelTemplate">
<telerik:RadWrapPanel/>
</ItemsPanelTemplate>
</UserControl.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<StackPanel>
<Button Content="StackPanel">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<ie:ChangePropertyAction TargetName="TargetListBox" PropertyName="ItemsPanel" Value="{StaticResource StackPanelTemplate}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
<Button Content="WrapPanel">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<ie:ChangePropertyAction TargetName="TargetListBox" PropertyName="ItemsPanel" Value="{StaticResource WrapPanelTemplate}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
</StackPanel>
<ListBox x:Name="TargetListBox" Grid.Column="1" ItemsSource="{Binding SomeCollection}"/>
</Grid>
当您以这种方式更改 ItemsPanelTemplate 时。ScrollViewer 似乎保持在您更改它之前的任何状态,并且使用滚动条不会影响 ListBox 上的任何更改。
任何人都可以提供有关此问题的任何见解或提供解决方法吗?
谢谢你。
* 编辑 *
因此,我将问题缩小到与虚拟化有关的问题。如果您仅将 VirtualizingStackPanel 更改为常规 StackPanel,则 ScrollViewer 不会中断。这对我来说并不是一个真正的解决方案,因为这个 ListBox 将容纳数百个搜索结果。