wpf styles itemscontrol

WPF: ¿Alternando colores en un ItemsControl?



listboxitem wpf (3)

¿Cómo obtengo colores alternos en un ItemsControl? Tengo AlternationCount establecido en 2, pero la propiedad ItemsControl.AlternationIndex siempre devuelve 0.

<ItemsControl ItemsSource="{Binding}" AlternationCount="2"> <ItemsControl.Resources> <Style x:Key="FooBar" TargetType="Grid"> <Style.Triggers> <Trigger Property="ItemsControl.AlternationIndex" Value="0"> <Setter Property="Background" Value="Blue"/> </Trigger> <Trigger Property="ItemsControl.AlternationIndex" Value="1"> <Setter Property="Background" Value="Red"/> </Trigger> </Style.Triggers> </Style> </ItemsControl.Resources> <ItemsControl.ItemTemplate> <DataTemplate> <Grid Margin="0,0,0,10" Style="{StaticResource FooBar}"> <Grid.ColumnDefinitions> <ColumnDefinition Width="25" /> <ColumnDefinition Width="100" /> <ColumnDefinition Width="100" /> <ColumnDefinition Width="100" /> <ColumnDefinition Width="100" /> <ColumnDefinition Width="100" /> <ColumnDefinition Width="100" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions > <RowDefinition Height="Auto" /> <!--<RowDefinition Height="Auto" />--> </Grid.RowDefinitions> <CheckBox IsChecked="{Binding Checked, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Center" /> <Label Grid.Column="1" Content="{Binding CompanyName}" /> <Label Grid.Column="2" Content="{Binding TradeKey}" /> <Label Grid.Column="3" Content="{Binding TradeDate}" ContentStringFormat="d" /> <Label Grid.Column="4" Content="{Binding Cusip}" /> <Label Grid.Column="5" Content="{Binding IssueName}" /> <Label Grid.Column="6" Content="{Binding TotalUnits}" ContentStringFormat="N0" /> <!--<Expander Grid.Row="0" Grid.Column="7" Grid.ColumnSpan="7" IsExpanded="True"> <Expander.Header> <StackPanel Orientation="Horizontal"> <Label Content="Allocations"/> <Button Content="Edit" Name="cmdEdit" Click="cmdEdit_Click" /> </StackPanel> </Expander.Header>--> <DataGrid Grid.Column="7" IsReadOnly="True" ItemsSource="{Binding Territories}" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False"> <DataGrid.Columns> <DataGridTextColumn Header="Rep on Ticket" Binding="{Binding TradeCustomer.RepNameNotes}" /> <DataGridTextColumn Header="Rep # on Ticket" Binding="{Binding TradeCustomer.RepNumberNotes}" /> <DataGridTextColumn Header="State" Binding="{Binding TradeCustomer.AccountStateKey}" /> <DataGridTextColumn Header="Qty. on Ticket" Binding="{Binding TradeCustomer.Quantity, StringFormat=N0}" /> <DataGridTextColumn Header="Zip Code" Binding="{Binding ZipCode}" /> <DataGridTextColumn Header="State" Binding="{Binding State}" /> <DataGridTextColumn Header="Territory" Binding="{Binding Territory}" /> </DataGrid.Columns> </DataGrid> <!--</Expander>--> </Grid> </DataTemplate> </ItemsControl.ItemTemplate> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <VirtualizingStackPanel /> </ItemsPanelTemplate> </ItemsControl.ItemsPanel> <ItemsControl.Template> <ControlTemplate> <Border BorderThickness="{TemplateBinding Border.BorderThickness}" Padding="{TemplateBinding Control.Padding}" BorderBrush="{TemplateBinding Border.BorderBrush}" Background="{TemplateBinding Panel.Background}" SnapsToDevicePixels="True"> <ScrollViewer Padding="{TemplateBinding Control.Padding}" Focusable="False"> <ItemsPresenter SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" /> </ScrollViewer> </Border> </ControlTemplate> </ItemsControl.Template> </ItemsControl>


Aquí hay una alternativa que puede ser un poco más general

<DataTemplate x:Key="AlternatingTemplate"> <Border> <Border.Style> <Style TargetType="{x:Type Border}"> <Style.Triggers> <DataTrigger Binding="{Binding Path=(ItemsControl.AlternationIndex), RelativeSource={RelativeSource AncestorType={x:Type ContentPresenter}}}" Value="0"> <Setter Property="Background" Value="White" /> </DataTrigger> <DataTrigger Binding="{Binding Path=(ItemsControl.AlternationIndex), RelativeSource={RelativeSource AncestorType={x:Type ContentPresenter}}}" Value="1"> <Setter Property="Background" Value="LightGray" /> </DataTrigger> </Style.Triggers> </Style> </Border.Style> <ContentPresenter Content="{Binding}" /> </Border> </DataTemplate>

Uso:

<ItemsControl AlternationCount="2" ItemTemplate="{StaticResource AlternatingTemplate}" ItemsSource="{Binding SourceOfData}" />


Consulte aquí http://www.codeproject.com/Articles/35886/WPF-ItemsControl-with-alternating-items-and-hover-.aspx

Tienes que cambiar tu código así para que funcione

<ItemsControl ItemsSource="{Binding DataList}" AlternationCount="2"> <ItemsControl.ItemTemplate> <DataTemplate> <Grid x:Name="FooBar" Margin="0,0,0,10"> ---------------------------- ---------------------------- </Grid> <DataTemplate.Triggers> <Trigger Property="ItemsControl.AlternationIndex" Value="0"> <Setter Property="Background" Value="Blue" TargetName="FooBar"/> </Trigger> <Trigger Property="ItemsControl.AlternationIndex" Value="1"> <Setter Property="Background" Value="Red" TargetName="FooBar"/> </Trigger> </DataTemplate.Triggers> </DataTemplate> </ItemsControl.ItemTemplate>


Si no desea utilizar el enfoque de DataTemplate , puede crear un control personalizado que use un ContentControl como contenedor de elementos, lo que le permite especificar un color de fondo.

Clase:

public class ItemsControlAlternating : ItemsControl { static ItemsControlAlternating() { DefaultStyleKeyProperty.OverrideMetadata(typeof(ItemsControlAlternating), new FrameworkPropertyMetadata(typeof(ItemsControlAlternating))); } protected override DependencyObject GetContainerForItemOverride() { return new ContentControl(); } protected override bool IsItemItsOwnContainerOverride(object item) { return item is ContentControl; } }

Diccionario de recursos:

<Style TargetType="{x:Type c:ItemsControlAlternating}"> <Setter Property="AlternationCount" Value="2"/> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type c:ItemsControlAlternating}"> <ItemsPresenter/> </ControlTemplate> </Setter.Value> </Setter> <Setter Property="ItemContainerStyle"> <Setter.Value> <Style TargetType="{x:Type ContentControl}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ContentControl}"> <Border Background="{TemplateBinding Background}"> <ContentPresenter/> </Border> </ControlTemplate> </Setter.Value> </Setter> <Style.Triggers> <Trigger Property="ItemsControl.AlternationIndex" Value="0"> <Setter Property="Background" Value="Gray"/> </Trigger> <Trigger Property="ItemsControl.AlternationIndex" Value="1"> <Setter Property="Background" Value="White"/> </Trigger> </Style.Triggers> </Style> </Setter.Value> </Setter> </Style>