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 🙂
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
Vous devez vous connecter pour publier un commentaire.
Je peux proposer deux solutions différentes pour votre question: la première est "code-behind-style" (qui vous demandez, mais personnellement, je pense que c'est pas la bonne approche dans WPF) et plus de type WPF (qui plus délicat, mais conserve le code-behind propre et utilise des styles, des déclencheurs et des convertisseurs)
La Solution 1. La gestion des événements et code-behind de la logique pour la coloration
Tout d'abord, l'approche que vous avez choisie ne fonctionnera pas directement - la AutoGeneratingColumn événement est destiné à être utilisé pour modifier la ensemble de la colonne apparence, et non sur la cellule par cellule. De sorte qu'il peut être utilisé pour, par exemple, en joignant le bon style à l'ensemble de la colonne en se basant sur son affichage de l'index ou d'une limite de propriété.
Une manière générale, pour la première fois, l'événement est déclenché votre grille de données n'aura pas de lignes (et par conséquent des cellules). Si vous avez vraiment besoin de prendre l'événement de votre grille de données.LoadingRow événement à la place. Et vous ne serez pas en mesure d'obtenir les cellules facile 🙂
Donc, ce que vous faites: la poignée de la LoadingRow cas, obtenir la ligne (il a la Élément propriété qui est surprenant :)) votre objet lié), obtenir l'objet lié, faire tous les calculs requis, obtenir de la cellule, vous devez modifier et enfin de modifier le style de la cellule cible.
Voici le code (comme le point-je utiliser un exemple d'objet avec l'int propriété "Valeur" que j'utilise pour la coloration).
XAML
.CS
La Solution 2. De type WPF
Cette solution utilise un code-behind seulement pour la valeur de couleur conversions (en supposant que cette logique de la coloration est plus complexe que la comparaison d'égalité - dans ce cas, vous pouvez utiliser des déclencheurs et ne plaisante pas avec des convertisseurs).
Ce que vous faites: jeu de grille de données.CellStyle bien avec le style qui contient des données de déclenchement, qui vérifie si la cellule est à l'intérieur d'une colonne désirée (en se basant sur c'est DisplayIndex) et si c'est - applique d'arrière-plan par l'intermédiaire d'un convertisseur.
XAML
.CS
UPD: Si vous avez besoin à la couleur de l'ensemble de la grille de données, XAML est beaucoup plus facile (pas besoin d'utiliser des déclencheurs). Utiliser les éléments suivants CellStyle:
IsFocusable
doit être changé.Merci pour cette très longue et de répondre de façon utile. Le convertisseur fonctionne bien je pense, mais ces cellules ne veulent tout simplement pas se colorent. J'ai essayé en modifiant le réglage et aussi je travaille avec des valeurs doubles. - edité un peu. Mais tout de même. Je ne suis pas assez amical avec la liaison de données. U ne pense qu'il pourrait y avoir un problème? Je suis de remplissage de la grille de données dans mon code c# à partir d'un dataset avec datatable. J'obtiens les valeurs dans un convertisseur correctement, mais il ne veut tout simplement pas la couleur de mes cellules de fond :'(
Auriez-vous svp poster un morceau de code que vous utilisez pour la liaison de la grille et le colorer (XAML + code-behind) afin que je puisse vérifier ce qui ne va pas?
Ok, il suffit de ne pas rire si il y a quelque chose de stupide. Mais le truc, c'est que les trucs que j'ai besoin dans la grille de données n'est pas toujours la même quantité (nombre de lignes/colonnes) donc je suis pour le remplissage d'un datatable avec ce genre de choses et de mettre la table dans le dataset simplement parce qu'il fonctionne en quelque sorte de cette façon. J'ai toujours remplir la grille de données avec des données avec un clic sur un bouton à l'aide de ce code:
mydatagrid.ItemsSource = dataset.Tables[0].DefaultView;
il fonctionne, mais je ne suis pas sûr de la façon de se connecter à ce genre de remplir la grille avec la configuration de la couleur de fond. Je n'écris rien sur la liaison dans le code xaml viens de le faire et il fonctionne.Post la coloration du code, plz.
OriginalL'auteur morincer
Ce que je voulais dire, c'est que vous pouvez définir le
CellStyle
propriété de la colonne, vous ne pouvez pas manipuler directement sur les cellules qu'ils ne sont pas disponibles dans cet événement. Le style peut contenir votre logique conditionnelle dans la forme deDataTriggers
(aurez besoin d'un convertisseur que vous avez des "moins que" et pas égal à) etSetters
.Également si la logique n'est pas spécifique aux colonnes vous pouvez définir la style dans le monde sur la grille lui-même. Le point de l'utilisation de l'événement serait de manipuler les propriétés de la colonne qui vous ne pouvez pas accès autrement.
OriginalL'auteur H.B.
Je ne suis pas sûr de savoir si cette propriété (de la Cellule.Le Style) est disponible dans votre WPF Datagrid. Probablement une alternative existe dans votre cas. Il a travaillé pour WinForms datagrid.
OriginalL'auteur KbManu