我想在运行时更改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而不是替换面板模板。

10-01 03:26
查看更多