2010-12-10 18 views
31

¿Cómo obtengo colores alternados en ItemsControl? Tengo AlternationCount establece en 2, pero la propiedad ItemsControl.AlternationIndex siempre devuelve 0.WPF: ¿Alternando colores en un ItemsControl?

 <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> 
+0

Compruebe mi respuesta en https://stackoverflow.com/questions/3567778/how-to-use-alternationindex-in-itemscontrols/47231505#47231505 – Sean

Respuesta

55

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

Usted tiene que cambiar su código como este 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> 
+0

Ah, ahora veo la diferencia. Gracias. –

+4

Solo quería llamar para que esto funcione. 'ItemsControl.AlternationCount' también se debe establecer en' 2' - me desconectó durante unos minutos –

1

Si no desea utilizar el enfoque 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> 
3

Aquí es 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}" /> 
Cuestiones relacionadas