我想在运行时更改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可以容纳数百个搜索结果。
最佳答案
我认为最简单的解决方法是替换整个ListBox而不是替换面板模板。