実行時に ListBox の ItemsPanelTemplate を変更したいと思います。
ItemsPanelTemplate を変更できる次の XAML があります。ただし、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 に変更はありません。
誰でもこの問題に関する洞察を提供したり、回避策を提供したりできますか?
ありがとうございました。
* 編集 *
そのため、問題を仮想化に関連するものに絞り込みました。通常の StackPanel の VirtualizingStackPanel を変更しても、ScrollViewer は壊れません。ただし、この ListBox には何百もの検索結果が保持されるため、これは実際には解決策ではありません。