Pourquoi ne puis-je pas le style d'un DataGridTextColumn?
J'ai essayé de créer un Style pour DataGridTextColumn
avec le code suivant
<Style TargetType="{x:Type DataGridTextColumn}">
...
</Style>
Toutefois, Visual Studio 2010, souligne {x:Type DataGridTextColumn}
avec une ligne bleue et il commente: Exception has been thrown by the target of an invocation.
Pourquoi cela se produit et comment puis-je résoudre ce problème?
- Jetez un oeil à ce lien, c'est comme une feuille de triche pour le style de datagrid: blogs.msdn.microsoft.com/jaimer/2009/01/20/...
- Avez-Ray une solution de travail pour vous? Si elle le faisait, je serais ravi de voir un exemple de code. La part je ne suis pas ici, c'est que le TargetType pour le style est FrameworkElement, alors comment pourriez-vous définir une propriété comme CanUserSort=False, par exemple? Cheers
- voici une autre manière... stackoverflow.com/questions/21982526/...
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas le style de la
DataGridTextColumn
parce queDataGridTextColumn
ne provient pas de l'FrameworkElement
(ouFrameworkContentElement
). Seulement FrameworkElement, etc prend en charge le style.Lorsque vous essayez de créer un style dans le code XAML pour n'importe quel type qui n'est pas un
FrameworkElement
ouFrameworkContentElement
vous obtenez ce message d'erreur.Comment voulez-vous résoudre ce problème? Comme avec n'importe quel problème, où il ya une volonté il ya un chemin. Dans ce cas, je pense que la solution la plus simple est de créer une propriété attachée pour DataGrid pour attribuer un DataGridColumn style:
La mise en œuvre devait être quelque chose le long de ces lignes:
La façon dont cela fonctionne est, à tout moment la propriété attachée est changé, un gestionnaire est ajouté pour les Colonnes.Événement CollectionChanged sur la grille. Lors de l'événement CollectionChanged feux, toutes les colonnes sont mis à jour avec le style qui a été défini.
Noter que le code ci-dessus ne permet pas de gérer la situation où un style est enlevé et rajouté gracieusement: Deux gestionnaires d'événements sont enregistrés. Une solution robuste, vous voulez résoudre ce problème en ajoutant une autre propriété jointe contenant le gestionnaire d'événements pour le gestionnaire d'événements peut être ou non, mais pour votre but, je pense que c'est sans importance.
Un autre inconvénient ici est que l'utilisation directe de SetBinding et SetValue sera la cause de la DependencyProperty d'avoir un BaseValueSource de
Local
au lieu deDefaultStyle
. Ce ne sera probablement pas faire de différence dans votre cas, mais j'ai pensé que je devrais le mentionner.L'étiquette de style a aller dans le bon endroit. Votre grille de données peut ressembler à ceci maintenant:
Vous pouvez d'abord essayer d'ajouter la balise style directement dans le DataGridTextColumn élément qui ne fonctionne pas. Vous pouvez toutefois créer des éléments pour "DataGridTextColumn.ElementStyle" et ou "DataGridTextColumn.EditingElementStyle" juste à l'intérieur de la "DataGridTextColumn" élément. Chacune de ces balises d'élément peut alors avoir des balises de style à l'intérieur d'eux:
Un style sera appliqué à la visualisation et l'autre sera appliqué lorsque la cellule est en mode édition. Notez que cela change d'un TextBlock lors de la visualisation d'une zone de texte lors de l'édition (Ce qui m'a dans un premier temps!).
C'est plus un complément à Ray Brûlures de la réponse. J'ai d'abord n'était pas en mesure de les mettre sur mon propre, mais avec l'aide de mm8 (https://stackoverflow.com/a/46690951/5381620) je l'ai eu en cours d'exécution. Fonctionne vraiment bien. Pour d'autres personnes qui ont des problèmes suite à cette propriété attachée approche peut-être un code snippet est utile.
xaml
Modifier: En première approche, je n'ai remplacer le style de l'ensemble. Dans la nouvelle version, il est encore possible de maintenir d'autres styles de modifications comme celui-ci
De plus simple:
Un DataGridTextColumn n'est rien mais une colonne avec un TextBlock en elle. Écrire un style avec le TargetType que TextBlock et lier la ElementStyle propriété de la DataGridTextColumn à elle. Espérons que ça aide!