Я хотел бы, чтобы 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 будет содержать сотни результатов поиска.