Style DataGridCell correctement

C'est une question suite à mon précédent problème, vous pouvez le trouver là

. Maintenant, j'ai défini une DataGrid avec un ElementStyle pour chaque colonne (qui ne définit que l' TextBlocks à l'intérieur en gras & blanc-viennent sur ce problème plus tard)

Alors maintenant, j'ai deux questions

Première question (résolu)

Quand j'arrive à définir un arrière-plan de ma cellule, il remplace le style par défaut, et le fond reste le même lorsque la cellule est mise en surbrillance.

Un exemple d'un style:

<!-- Green template for market-related -->
<ControlTemplate x:Key="Green" TargetType="{x:Type tk:DataGridCell}">
    <Grid Background="Green">
        <ContentPresenter
                        HorizontalAlignment="Center"
                                  VerticalAlignment="Center" />
    </Grid>
</ControlTemplate>

J'avais naturellement dire que c'est "normal" car j'ai mis le Grid'arrière-plan Vert. J'ai donc essayé de cette façon:

<!-- Light green template for sophis-related -->
<ControlTemplate x:Key="LightGreen" TargetType="{x:Type tk:DataGridCell}">
    <Grid Background="LightGreen">
        <Grid.Resources>
            <Style TargetType="{x:Type Grid}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type tk:DataGridCell}}, 
                                            Converter={StaticResource DebugConverter}}" Value="True">
                        <Setter Property="Grid.Background" Value="#FF3774FF" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Grid.Resources>
        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
    </Grid>
</ControlTemplate>

Cela ne fonctionne pas non plus. Comme vous pouvez le voir j'ai mis un DebugConverter afin que je puisse vérifier que le déclencheur est en fait appelée, ce qui est le cas, mais... le Fond ne change pas (et Snoop le confirme...)

Troisième essai:

<!-- Light green template for sophis-related -->
<ControlTemplate x:Key="LightGreen" TargetType="{x:Type tk:DataGridCell}">
    <ControlTemplate.Resources>
        <Style TargetType="{x:Type tk:DataGridCell}">
            <Setter Property="Background" Value="LightGreen" />
        </Style>
    </ControlTemplate.Resources>
    <Grid>
        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
    </Grid>
</ControlTemplate>

Et... Pas d'arrière-plan sera affiché (reste transparent)

Donc je pense que je suis en train de travailler dans le mauvais sens ici et je me demandais ce que je dois faire pour définir SIMPLEMENT la "non sélectionné" modèle.
Je dirais que j'ai peut-être besoin de définir un style Basée le style "classique" mais, comment dois-je procéder? J'ai essayé d'ajouter TemplateBindings sans succès

** EDIT:**

Que H B a suggéré dans sa réponse, le problème venait de DependencyProperty Priorité, voici la solution:

<!-- Light green template for sophis-related -->
<ControlTemplate x:Key="LightGreen" TargetType="{x:Type tk:DataGridCell}">
    <Grid>
        <Grid.Resources>
            <Style TargetType="{x:Type Grid}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type tk:DataGridCell}}, 
                                            Converter={StaticResource DebugConverter}}" Value="True">
                        <Setter Property="Grid.Background" Value="#FF316AC5" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type tk:DataGridCell}}, 
                                            Converter={StaticResource DebugConverter}}" Value="False">
                        <Setter Property="Grid.Background" Value="LightGreen" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Grid.Resources>
        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
    </Grid>
</ControlTemplate>

Deuxième question

Maintenant, nous allons parler Triggers.

Fondamentalement, ce que je veux faire est de définir la spécificité de Triggers à mon ElementStyle de sorte que la police, la couleur est blanc si la cellule arrière-plan est Rouge ou Vert (le seul objectif est d'avoir une meilleure lisibilité comme le Rouge et le Vert sont un peu sombres, police noire sur fond sombre résultats dans un joli fail :p )

Modifier Semble que je ne suis pas assez clair: le style suivant est le style appliqué à chaque élément de la grille de données, par le biais de la propriété DataGridTextColumn.ElementStyle. Voici le code de la manipulation:

    void VolatilityDataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
        DataGridTextColumn column = e.Column as DataGridTextColumn;
        column.ElementStyle = s_boldCellStyle;
        //Other stuff here...
    }

Voici ce que je fais:

<!-- Cell style for colored matrix-->
<Style x:Key="BoldCellStyle" TargetType="{x:Type TextBlock}">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Background, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type tk:DataGridCell}}}" 
                     Value="Red">
            <Setter Property="Foreground" Value="White" />
        </DataTrigger>
        <DataTrigger Binding="{Binding Background, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type tk:DataGridCell}}, 
                                Converter={StaticResource DebugConverter}}"
                     Value="Green">
            <Setter Property="Foreground" Value="White" />
        </DataTrigger>
    </Style.Triggers>
    <Setter Property="FontWeight" Value="Bold"/>
</Style>

Et... Ça ne fonctionne pas. Étrangement, ce qui passe par le convertisseur est SEULEMENT transparent couleurs d'arrière-plan. Je suis vraiment manqué quelque chose!
BTW, j'ai aussi essayé avec classique déclenche, sans succès non plus, j'utilise DataTriggers ici, ce qui me permet de déboguer les valeurs contraignantes!

Maintenant, j'ai été bloqué pendant plus de trois jours, et je suis en train de capoter... j'espère que la Stackoverflow communauté va me sauver 🙂

Merci!

Modifier

Ok, mise à jour.
J'ai compris pourquoi mon Trigger ne fonctionne pas. L'arrière-plan fait est sur le Grid et PAS sur le DataGridCell. Il est donc normal que je n'ai pas toutes les couleurs ensemble.

Cependant, j'ai couru quelques tests et constaté que, lorsque la liaison est définie, le TextBlock n'a pas de parent (Parent = null). La liaison à un RelativeSource de type Grid va me lient à... l'ensemble de La DataGrid éléments de l'animateur.
Je ne sais pas quoi faire maintenant, car il semble être que de la réelle TextBlock style je ne peux pas atteindre le parent Grid et, par conséquent, ne peut pas résoudre de quelle couleur dois-je afficher selon le contexte.
Aussi, je ne peux pas changer la couleur de Police dans mon ControlTemplate parce que le DataGrid veut un Style pour chaque colonne, qui remplace le modèle du style par défaut (voir ma précédente question, et sa réponse)
Donc... Coincé de nouveau je suis!

OriginalL'auteur Damascus | 2011-08-18