Windows 8 用の Metro スタイル アプリでは、Listview を ObservableCollection にバインドしています。各 ListViewItem の背景色を交互に (白、灰色、白など) したいと考えています。
<ListView x:Name="stopsListView" ItemsSource="{Binding}" >
<ListView.ItemTemplate>
<DataTemplate>
<Grid Height="66" >
<TextBlock Text="{Binding Title}" />
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
WPF では、これはトリガー付きのスタイルを使用して行われます -このページを参照してください。
Metro アプリでこれをどのように実現しますか?
アップデート:
以下に正しい答えが与えられた後、私は立ち去って実際にコーディングしました。必要な人のためのコードを次に示します。
値コンバーター クラスのコード:
public class AltBackgroundConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
if (!(value is int)) return null;
int index = (int)value;
if (index % 2 == 0)
return Colors.White;
else
return Colors.LightGray;
}
// No need to implement converting back on a one-way binding
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
throw new NotImplementedException();
}
}
XAML リストビューのコード:
<ListView x:Name="stopsListView" ItemsSource="{Binding}">
<ListView.ItemTemplate>
<DataTemplate>
<Grid Width="250" Height="66" Margin="5">
<Grid.Background>
<SolidColorBrush Color="{Binding IndexWithinParentCollection, Mode=OneWay, Converter={StaticResource AltBGConverter}}" />
</Grid.Background>
...そして、コレクションにアイテムを追加したり、コレクションを変更したりするときは、コレクション内でインデックスを設定することを忘れないでください:
myCollection.add(item);
item.IndexWithinParentCollection = myCollection.Count;
もちろん、コレクションが頻繁に変更される場合、アイテムのインデックスを再作成する必要があるため、このアプローチは維持にコストがかかります。そのため、各アイテム内の親コレクションへの参照を保存してから、インデックスを計算する方が簡単であることがわかりました。 - .IndexOf() を使用して、コレクションが変更されるたびにインデックス値を常に更新する必要がないようにします。