2010-01-12 9 views
2

Je suis en train de créer un programme WPF qui est capable de colorer les lignes en DataGrid une par une en rouge en utilisant la boucle for et j'ai rencontré quelque chose de bizarre. Si le DataGrid contient plus de 40 lignes de données provenant d'une table de base de données, il ne colore pas toutes les lignes.Coloriage WPF DataGridRows un par un

Voici le code que j'utilise.

private void Red_Click(object sender, RoutedEventArgs e) 
{ 
    for (int i = 0; i < dataGrid1.Items.Count; i++) 
    { 
     DataGridRow row = (DataGridRow)dataGrid1.ItemContainerGenerator.ContainerFromIndex(i); 
     if (row != null) 
     { 
      row.Background = Brushes.Red; 
     } 
    } 
} 

est-il une autre façon de colorer les lignes une par une par d'autres méthodes ou est-ce une sorte de faute dans wpftoolkit?

Répondre

4

Si vous Vous voulez définir des couleurs pour chaque ligne et vous avez une propriété sur les éléments que les lignes affichent. Vous pouvez utiliser ItemsContainerStyle pour définir la couleur de la ligne. Dans l'exemple ci-dessous, vous avez une propriété appelée ItemColour sur vos éléments dans la grille qui définirait la couleur de la ligne d'arrière-plan. La liaison se lie de la ligne à l'élément que contient la ligne.

<dg:DataGrid.ItemContainerStyle> 
    <Style 
     TargetType="{x:Type dg:DataGridRow}" 
     BasedOn="{StaticResource {x:Type dg:DataGridRow}}"> 
     <Setter 
      Property="Background" 
      Value="{Binding ItemColour}" /> 
    </Style> 
</dg:DataGrid.ItemContainerStyle> 

Vous ne souhaitez peut-être pas de propriété ItemColour sur vos articles, car ils pourraient être votre modèle commercial. C'est là qu'un ViewModel prend tout son sens. vous définissez une couche intermédiaire qui enveloppe votre couche de gestion et la propriété ItemColour basée sur une logique personnalisée.

+0

Pouvez-vous donner un exemple sur ce ViewModel? Je ne suis toujours pas bon quand il s'agit de propriétés de liaison. – KenNY

+1

http://sites.google.com/site/wpfprojects/ téléchargez l'exemple de lignes colorées et marquez cette question comme ayant été répondue. Il pourrait y avoir quelques autres projets là-bas que vous pourriez aimer regarder ainsi –

+0

+1 pour l'orthographe colorée avec un «u», oh, et merci pour l'exemple. – Grokodile

0

Les lignes qui ne sont pas visibles sur l'écran ne peuvent pas être colorées en utilisant cette méthode car elles sont virtualisées et n'existent pas réellement. Dans le style ci-dessous im se liant à une propriété IsRed pour transformer les lignes entre le rouge et leur couleur par défaut (mettre cela dans les ressources du de la DataGrid sur lui)

 <Style 
      TargetType="{x:Type dg:DataGridRow}" 
      BasedOn="{StaticResource {x:Type dg:DataGridRow}}"> 
      <Style.Triggers> 
       <DataTrigger 
       Binding="{Binding ElementName=self, Path=IsRed}" 
       Value="True"> 
       <Setter 
        Property="Background" 
        Value="Red" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 

j'ai une propriété de dépendance sur mon formulaire appelé IsRed, cela pourrait aussi être une propriété qui implémente INotifyPropertyChanged (propriétés de dépendance informent au sujet de leurs changements)

public Boolean IsRed { 
    get { return (Boolean)GetValue(IsRedProperty); } 
    set { SetValue(IsRedProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for IsRed. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty IsRedProperty = 
     DependencyProperty.Register("IsRed", typeof(Boolean), typeof(Window1), new UIPropertyMetadata(false)); 

alors dans mon XAML i ont la déclaration au sommet

<Window 
    x:Class="Grids.Window1" 
    x:Name="self"> 

qui signifie que je peux faire référence avec un nom d'élément de liaison (une technique que je trouve utile)

Avec le code comme ive décrit tout votre cliquage aurait à faire serait

private void Button_Click(object sender, RoutedEventArgs e) { 
    IsRed = !IsRed; 
    } 
+0

Je vois.Si les lignes n'existent pas car elles ne sont pas visibles sur la grille de données, cela signifie-t-il qu'il n'est pas possible de colorer les lignes avec plus d'une couleur (par exemple: Blanc/Noir/Gris ou Jaune/Rouge/Bleu)? Merci pour la réponse. Je pense toujours qu'il doit y avoir d'autres moyens de résoudre cela. – KenNY

2

Si vous voulez pour définir l'arrière-plan de toutes les lignes de votre grille, vous pouvez définir un nouvel objet de style de ligne et définir la propriété its Background; cela devrait changer tous les rangs en même temps sans avoir besoin de les parcourir. Smth comme ceci:

dataGrid1.RowStyle = new Style(typeof(DataGridRow)); 
dataGrid1.RowStyle.Setters.Add(new Setter(Control.BackgroundProperty, new SolidColorBrush(Colors.Red))); 

Il y a aussi une chance que vous avez besoin de changer de fond de vos lignes DataGrid selon états des objets de données derrière eux. Dans ce cas, vous pouvez configurer un style personnalisé avec des déclencheurs dans votre xaml et lui attribuer le style rowstyle. Je suppose que SMTH comme ceci:

<Window.Resources> 
    <Style x:Key="customDataGridRowStyle" TargetType="{x:Type DataGridRow}"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Test1}" Value="1"> 
       <Setter Property="Background" Value="Red"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 
.. 
<DataGrid .. DataGrid.RowStyle ="{StaticResource customDataGridRowStyle}" > 
.. 

dans l'exemple ci-dessus fond rouge est réglé sur la ligne à chaque fois qu'il est « Test1 » propriété obtient la valeur « 1 »

espérons que cette aide, ce qui