In my Metro style app for Windows 8, I bind a Listview to an ObservableCollection, and I would like the background color of each ListViewItem to alternate (white, gray, white, etc.)
<ListView x:Name="stopsListView" ItemsSource="{Binding}" > <ListView.ItemTemplate> <DataTemplate> <Grid Height="66" > <TextBlock Text="{Binding Title}" /> </Grid> </DataTemplate> </ListView.ItemTemplate>
In WPF, this is done using a trigger style - see this page .
How do you do this in the Metro app?
Update:
After the correct answer was given below, I left and actually encoded it. Here is the code for those who need it:
Code for the value converter class:
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; }
Code for the XAML list:
<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>
... and when adding items to the collection or modifying the collection, be sure to set their Index in the collection:
myCollection.add(item); item.IndexWithinParentCollection = myCollection.Count;
Of course, if your collection changes often, this approach will be costly to maintain, since you would have to reindex your elements, so it was easier for me to store the link to the parent collection in each element, and then calculate the Index on the fly using .IndexOf (), to avoid having to constantly update index values ββevery time the collection changes.