AlternationCountという依存プロパティと、AlternationIndexという添付プロパティがItemsControlに追加されたっぽい。
AlternationCountを指定すると、各要素にAlternationIndexが設定されるようになる。AlternationCountが2の場合は、AlternationIndexは0,1,0,1,0,1...という感じでふられるみたいだ。
これと、StyleのTriggerを組み合わせることでListBoxとかの行の色を交互に変えたりってことが簡単に出来るようになるって寸法らしい。ということで早速実験。
いつも通りPersonクラスを定義してとかがめんどくさくなったので、ListBoxのタグの下にListBoxItemタグを直接書いてListBoxの中身をハードコーディングして適当にデータを表示する部分まででっちあげてみた。
<Window x:Class="WpfListBackground.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
<ListBox>
<ListBoxItem Content="田中 太郎" />
<ListBoxItem Content="田中 次郎" />
<ListBoxItem Content="田中 三郎" />
<ListBoxItem Content="田中 四郎" />
<ListBoxItem Content="田中 五郎" />
<ListBoxItem Content="田中 太郎" />
<ListBoxItem Content="田中 次郎" />
<ListBoxItem Content="田中 三郎" />
<ListBoxItem Content="田中 四郎" />
<ListBoxItem Content="田中 五郎" />
<ListBoxItem Content="田中 太郎" />
<ListBoxItem Content="田中 次郎" />
<ListBoxItem Content="田中 三郎" />
<ListBoxItem Content="田中 四郎" />
<ListBoxItem Content="田中 五郎" />
<ListBoxItem Content="田中 太郎" />
<ListBoxItem Content="田中 次郎" />
<ListBoxItem Content="田中 三郎" />
<ListBoxItem Content="田中 四郎" />
<ListBoxItem Content="田中 五郎" />
</ListBox>
</Grid>
</Window>
実行すると、特に何の変哲も無いウィンドウとリストボックスが表示される。
今回の目玉の機能を追加していこうと思う。ListBoxに、AlternationCountプロパティの設定を追加する。交互に色を変えたいので、2を設定しておいた。
<Grid>
<ListBox AlternationCount="2">
<ListBoxItem Content="田中 太郎" />
<ListBoxItem Content="田中 次郎" />
そして、ListBoxのItemContainerStyleプロパティでAlternationIndexが0の時と1の時とでTriggerを使って背景色を変えるようなスタイルを設定する。
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Style.Triggers>
<Trigger Property="ItemsControl.AlternationIndex" Value="0">
<Setter Property="Background" Value="LightGray" />
</Trigger>
<Trigger Property="ItemsControl.AlternationIndex" Value="1">
<Setter Property="Background" Value="LightGreen" />
</Trigger>
</Style.Triggers>
</Style>
</ListBox.ItemContainerStyle>
これを実行すると、下のようになる。交互に色が変わっていていい感じ。
今回はC#のコードを書いてない。欲求不満だ!!
ということで、XAML全体を晒してこのエントリは終了。因みに、試してないけどItemsControlの子のコントロールは全部この方法で色を交互にしたり出来ると思われる。素敵だね。
<Window x:Class="WpfListBackground.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<Grid>
<ListBox AlternationCount="2">
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Style.Triggers>
<Trigger Property="ItemsControl.AlternationIndex" Value="0">
<Setter Property="Background" Value="LightGray" />
</Trigger>
<Trigger Property="ItemsControl.AlternationIndex" Value="1">
<Setter Property="Background" Value="LightGreen" />
</Trigger>
</Style.Triggers>
</Style>
</ListBox.ItemContainerStyle>
<ListBoxItem Content="田中 太郎" />
<ListBoxItem Content="田中 次郎" />
<ListBoxItem Content="田中 三郎" />
<ListBoxItem Content="田中 四郎" />
<ListBoxItem Content="田中 五郎" />
<ListBoxItem Content="田中 太郎" />
<ListBoxItem Content="田中 次郎" />
<ListBoxItem Content="田中 三郎" />
<ListBoxItem Content="田中 四郎" />
<ListBoxItem Content="田中 五郎" />
<ListBoxItem Content="田中 太郎" />
<ListBoxItem Content="田中 次郎" />
<ListBoxItem Content="田中 三郎" />
<ListBoxItem Content="田中 四郎" />
<ListBoxItem Content="田中 五郎" />
<ListBoxItem Content="田中 太郎" />
<ListBoxItem Content="田中 次郎" />
<ListBoxItem Content="田中 三郎" />
<ListBoxItem Content="田中 四郎" />
<ListBoxItem Content="田中 五郎" />
</ListBox>
</Grid>
</Window>