ListViewで縦と横にアイテムを配置

ListViewにWrapPanelのような配置をさせる方法。

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        xmlns:vm="clr-namespace:WpfApplication1.ViewModel"
        Title="MainWindow" Height="350" Width="525">
    
    <Window.Resources>
        <ResourceDictionary>
            <CollectionViewSource x:Key="DataSource"
                                  Source="{Binding}"
                                  d:Source="{d:DesignInstance Type=vm:ItemList, IsDesignTimeCreatable=True}"/>
            <SolidColorBrush x:Key="ListBorder" Color="#828790"/>
            <!-- 基本、デフォルトのスタイルそのまま -->
            <Style x:Key="ListViewStyle1" TargetType="{x:Type ListView}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type ListView}">
                            <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="1" SnapsToDevicePixels="true">
                                <!-- 変えたのはここのHorizontalScrollBarVisibilityとVerticalScrollBarVisibilityのみ -->
                                <!-- リストビューの同名プロパティに連動する -->
                                <ScrollViewer Focusable="false" Padding="{TemplateBinding Padding}" HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}" VerticalScrollBarVisibility="{TemplateBinding ScrollViewer.VerticalScrollBarVisibility}">
                                    <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                                </ScrollViewer>
                            </Border>
                            <ControlTemplate.Triggers>
                                <Trigger Property="IsEnabled" Value="false">
                                    <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                                </Trigger>
                                <MultiTrigger>
                                    <MultiTrigger.Conditions>
                                        <Condition Property="IsGrouping" Value="true"/>
                                        <Condition Property="VirtualizingPanel.IsVirtualizingWhenGrouping" Value="false"/>
                                    </MultiTrigger.Conditions>
                                    <Setter Property="ScrollViewer.CanContentScroll" Value="false"/>
                                </MultiTrigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ResourceDictionary>
    </Window.Resources>

    <Grid>
        <ListView x:Name="listView" ItemsSource="{Binding Source={StaticResource DataSource}}" Style="{StaticResource ListViewStyle1}" ScrollViewer.VerticalScrollBarVisibility="Disabled">
            <ListView.ItemsPanel>
                <ItemsPanelTemplate>
                    <!-- HeightまたはWidthをリストビューと連動させる -->
                    <WrapPanel Orientation="Vertical" Height="{Binding Height, ElementName=listView}"/>
                </ItemsPanelTemplate>
            </ListView.ItemsPanel>
        </ListView>
    </Grid>

</Window>