【WPF】ListBoxのアイテムに、バインドしたコレクションのインデックスを出す


やりたいこと

リストボックスのアイテムに、そのアイテム自身のインデックス(自分がコレクションの何番目か)を出したい。

結論

ItemsControl.AlternationIndex を使う。
下記のようにする。

MainWindow.xaml
<ListBox
    ItemsSource="{Binding ListBoxData4}"
    AlternationCount="10">

    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid>
                <StackPanel Margin="5">
                    <!-- やり方1 -->
                    <ContentControl >
                        <Binding Path="(ItemsControl.AlternationIndex)" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}"/>
                    </ContentControl>

                    <!-- やり方2 -->
                    <TextBlock Text="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}, Path=(ItemsControl.AlternationIndex), StringFormat={}{0}}"/>

                    <!-- アイテムそのままを出す -->
                    <TextBlock Text="{Binding}" HorizontalAlignment="Center"/>
                </StackPanel>
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

こんな感じになる。

注意点

  • AlternationIndexは、ListBoxに追加されたアイテムを、AlternationCountに設定された数までカウントして、その数を超えるとまた0に戻る。多数のアイテムを追加する場合は、AlternationCountを十分大きい値にする必要がある。

参考

WPF・XAML: ItemsControl の各項目表示にインデックス値を使う
https://www.ruche-home.net/boyaki/2015-02-25/WPFXAMLI

How to use AlternationIndex in ItemsControls?
https://stackoverflow.com/questions/3567778/how-to-use-alternationindex-in-itemscontrols

WPF の ListBox で N 番目の要素にスタイルをあてる
http://var.blog.jp/archives/67337347.html

コード