2009-10-07 17 views
3

J'ai une collection d'articles et je veux avoir une rangée de coloration alternée, j'ai regardé sur la façon de le faire, mais ne trouve rien, je pense que cela devrait être simple mais peut-être que je suis Il manque quelque chose.ItemsCollection et coloration de ligne alternatif

C'est WPF btw.

<Grid> 
     <ItemsControl Name="itemsControl"> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <Grid> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="*"/> 
          <ColumnDefinition Width="*"/> 
          <ColumnDefinition Width="80"/> 
         </Grid.ColumnDefinitions> 
         <TextBlock Grid.Column="0" Text="{Binding Path=name}" VerticalAlignment="Center"/> 
         <TextBlock Grid.Column="1" Text="{Binding Path=something}" VerticalAlignment="Center"/> 
         <Button Grid.Column="2" Content="Launch" Tag="{Binding}" Height="25" VerticalAlignment="Center" Click="Button_Click"/> 
        </Grid> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
      <ItemsControl.ItemContainerStyle> 
       <Style> 
        <Setter Property="Control.Margin" Value="5"/> 
       </Style> 
      </ItemsControl.ItemContainerStyle> 
     </ItemsControl> 
     <Button Height="23" HorizontalAlignment="Right" Margin="0,0,12,12" Name="button1" VerticalAlignment="Bottom" Width="75" Click="button1_Click">Button</Button> 
    </Grid> 

Répondre

6

Ajoutez AlternationCount="2" à vos ArticlesContrôle.

Ensuite, ajoutez ceci à votre ItemContainerStyle pour obtenir alternance articles rouge/bleu:

<Style.Triggers> 
    <Trigger Property="ItemsControl.AlternationIndex" Value="0"> 
    <Setter Property="Control.Background" Value="Red"></Setter> 
    </Trigger> 
    <Trigger Property="ItemsControl.AlternationIndex" Value="1"> 
    <Setter Property="Control.Background" Value="Blue"></Setter> 
    </Trigger> 
</Style.Triggers> 

Edit: vous devez avoir le 3.0/.NET 3.5 SP1 .

+0

je reçois ne peut pas résoudre fond de la propriété de style lorsque vous utilisez votre exemple – RubbleFord

+0

Essayez Control.Background –

+0

Les compiles de code maintenant, mais pas de couleurs alternantes malheureusement, je vais continuer à creuser. – RubbleFord

0

Utilisez-vous 3.5 SP1? Si c'est quelques propriétés que vous voulez changer (comme l'arrière-plan) alors la méthode la plus simple est probablement un convertisseur comme dans this example on MSDN.

Une alternative, et une qui vous laisse faire un peu plus, y compris en remplaçant le modèle, serait d'utiliser un déclencheur sur le ItemsControl.AlternationIndex comme démontré dans this blog post.

2

Vous avez besoin de 2 styles (un pour la rangée régulière et l'autre pour la rangée alternée bien sûr) et un sélecteur de style pour les rangées alternées. Cela a fonctionné pour moi:

XAML:

<Window.Resources> 
     <Style x:Key="theAlternateStyle"> 
      <Setter Property="ListBoxItem.Background" Value="LightGray" /> 
     </Style> 
     <Style x:Key="theDefaultStyle"> 
      <Setter Property="ListBoxItem.Background" Value="Blue" /> 
     </Style> 
    </Window.Resources> 

    <Grid Margin="4"> 
     <ListBox DisplayMemberPath="Name" ItemsSource="{Binding}"> 
      <ListBox.ItemContainerStyleSelector> 
       <local:AlternatingRowStyleSelector AlternateStyle="{StaticResource theAlternateStyle}" DefaultStyle="{StaticResource theDefaultStyle}" /> 
      </ListBox.ItemContainerStyleSelector> 
     </ListBox> 
    </Grid> 

sélecteur de ligne (C#):

public class AlternatingRowStyleSelector : StyleSelector 
{ 
    public Style DefaultStyle { get; set; } 
    public Style AlternateStyle { get; set; } 

    // Flag to track the alternate rows 
    private bool isAlternate = false; 

    public override Style SelectStyle(object item, DependencyObject container) 
    { 
     // Select the style, based on the value of isAlternate 
     Style style = isAlternate ? AlternateStyle : DefaultStyle; 

     // Invert the flag 
     isAlternate = !isAlternate; 

     return style; 
    } 
}