Comment mettre fond d'un datagrid cellule lors de la AutoGeneratingColumn événement en fonction de sa valeur?

Je suis toujours en train de lutter avec la manipulation de cellules d'origines, donc je suis en posant une nouvelle question.

Un utilisateur "H. B." a écrit qu'il m'est possible de définir le style de cellule au cours de la AutoGeneratingColumn événement - Changement de grille de données de la cellule de la couleur basée sur les valeurs. Le problème est que je ne suis pas sûr de savoir comment faire.

Ce que je veux:
Définir les différents couleurs d'arrière-plan pour chaque cellule en fonction de sa valeur. Si la valeur est null je veux aussi qu'il pas être cliquable (focusable je suppose).

Ce que j'ai /je suis en train de faire:

private void mydatagrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    foreach (Cell cell in e.Column)
    {
        if (cell.Value < 1)
        { 
            cell.Background = Color.Black; 
            cell.isFocusable = false; 
        } 
        else
        {
            cell.Background = Color.Pink;
        }
    }
}

C'est juste le pseudo-code. C'est quelque chose comme ceci est possible au cours de la colonne auto-génération et si oui, comment puis-je modifier mon code de sorte qu'il sera valide?

J'ai lu au sujet de la valeur de fumées, mais je veux savoir si c'est possible en quelque sorte par programme, sans avoir à écrire de code XAML.

S'il vous plaît comprendre que je suis encore un débutant en C#/WPF/DataGrid.

Solution part1:

J'ai utilisé la réponse que j'ai accepté. Il suffit de le mettre dans

<Window.Resources> 
<local:ValueColorConverter x:Key="colorConverter"/>
        <Style x:Key="DataGridCellStyle1" TargetType="{x:Type DataGridCell}"> 
            <Setter Property="Padding" Value="5"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type DataGridCell}">
                        <Border Padding="{TemplateBinding Padding}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels="True">
                            <Border.Background>
                                <MultiBinding Converter="{StaticResource colorConverter}">
                                    <Binding RelativeSource="{RelativeSource AncestorType=DataGridCell}" Path="Content.Text"/>
                                    <Binding RelativeSource="{RelativeSource AncestorType=DataGridCell}" Path="IsSelected"/>
                                </MultiBinding>
                            </Border.Background>
                            <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
</Window.Resources>

Et pour un MultiBinding convertisseur donc je pouvez également définir la couleur de fond des cellules sélectionnées.

Problème:

Je n'ai plus qu'à résoudre le problème de la mise au point de cellules vides. Un indice?

  <Style.Triggers>
        <Trigger Property="HasContent" Value="False">
            <Setter Property="Focusable" Value="False"/>
        </Trigger>
    </Style.Triggers>

Cela ne fonctionne pas. J'avais des chaînes vides dans les cellules vides, mais ils sont remplis avec les valeurs null, donc ça devrait marcher, non? Ou ce que je fais de mal 😐 ?

Solution partie 2:

Donc le code ci-dessus ne fonctionnera pas tant que la valeur de la cellule est une zone de texte j'ai donc décidé de trouver une autre manière de faire qui peut être trouvé dans ma réponse ici: https://stackoverflow.com/a/16673602/2296407

Merci d'essayer de m'aider 🙂

vous pouvez essayer dans la rowdatabound cas de la grille. stackoverflow.com/questions/3146456/...
Auto-généré cellule, certes, a le "contenu" - c'est <TextBlock> (c'est pourquoi j'ai utilisé le Contenu.Texte de ma réponse) 🙂 Essayez d'utiliser <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Contenu.Texte}" Value="{x:Null}"
Merci pour votre aide. J'ai réussi à travailler avec les cellules vides d'autre moyen de provoquer la DataTrigger ne voulait pas travailler avec moi et j'étais déjà très mad :D. Mais vraiment merci pour le soutien.
pas de problèmes. Ajout de code de style de commentaire à votre réponse si
Il ressemble plus à un faux code = code de pseudo 🙂 (j'ai le même problème, mais je cherche une solution dans le code-behind

OriginalL'auteur Ms. Nobody | 2013-05-20