As an alternative approach, I would suggest binding the AlternationCount your ItemsControl to the number of items in your collection (for example, to the Count property). Then it assigns a unique AlternationIndex (0, 1, 2, ... Count-1) to each container in the ItemsControl . See here for more information:
http://msdn.microsoft.com/en-us/library/system.windows.controls.itemscontrol.alternationcount.aspx
Once each container has a unique AlternationIndex , you can use the DataTrigger in your Style container to set the ItemTemplate based on the index. This can be done using MultiBinding with a converter that returns True if the index is equal to the score, False otherwise. Of course, you can also create a selector around this approach. With the exception of the converter, this approach is good, as it is a XAML solution.
Example using ListBox :
<Window x:Class="WpfApplication4.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Collections="clr-namespace:System.Collections;assembly=mscorlib" xmlns:System="clr-namespace:System;assembly=mscorlib" xmlns:l="clr-namespace:WpfApplication4" Title="MainWindow" Height="350" Width="525"> <Grid> <Grid.Resources> <Collections:ArrayList x:Key="MyCollection"> <System:String>Item One</System:String> <System:String>Item Two</System:String> <System:String>Item Three</System:String> </Collections:ArrayList> <l:MyAlternationEqualityConverter x:Key="MyAlternationEqualityConverter" /> <Style x:Key="MyListBoxItemStyle" TargetType="{x:Type ListBoxItem}"> <Style.Triggers> <DataTrigger Value="True"> <DataTrigger.Binding> <MultiBinding Converter="{StaticResource MyAlternationEqualityConverter}"> <Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type ListBox}}" Path="Items.Count" /> <Binding RelativeSource="{RelativeSource Self}" Path="(ItemsControl.AlternationIndex)" /> </MultiBinding> </DataTrigger.Binding> <Setter Property="Background" Value="Red"/> </DataTrigger> </Style.Triggers> </Style> </Grid.Resources> <ListBox ItemsSource="{Binding Source={StaticResource MyCollection}}" AlternationCount="{Binding RelativeSource={RelativeSource Self}, Path=Items.Count}" ItemContainerStyle="{StaticResource MyListBoxItemStyle}" /> </Grid>
Where the converter might look something like this:
class MyAlternationEqualityConverter : IMultiValueConverter { #region Implementation of IMultiValueConverter public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { if (values != null && values.Length == 2 && values[0] is int && values[1] is int) { return Equals((int) values[0], (int) values[1] + 1); } return DependencyProperty.UnsetValue; } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) { throw new NotSupportedException(); } #endregion }
F Ruffell Oct. 20 '11 at 11:28 2011-10-20 11:28
source share