Je tente de créer une grille de données dans laquelle l'une des colonnes est un nom de police affiché dans cette police. Auparavant, je travaillais avec une zone de liste où j'avais défini le modèle suivant:Liaison dans une colonne de texte de la grille de données WPF
<TextBlock Text="{Binding Path=Name}" FontFamily="{Binding Path=Name}"/>
Cela a très bien fonctionné. Donc, j'ai modifié la structure de données (le nom est devenu Font.Name) et déplacé sur une grille de données pour essayer ceci:
<dg:DataGridTextColumn Binding="{Binding Font.Name}"
FontFamily="{Binding Font.Name}" IsReadOnly="True" Header="Font"/>
Maintenant, les noms de polices sont tous affichés dans la police par défaut, et je reçois cette erreur:
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or
FrameworkContentElement for target element.
BindingExpression:Path=Font.Name; DataItem=null; target element is
'DataGridTextColumn' (HashCode=56915998); target property is 'FontFamily'
(type 'FontFamily')
quelques résultats Google traitant des contrôles personnalisés vous suggérons de changer la propriété de DependencyObject à FrameworkElement, mais je dois hériter DataGridTextColumn et de définir ma propre propriété de le faire - il doit y avoir une meilleure façon.
J'ai essayé plusieurs approches différentes de la liaison, y compris tenter de modifier uniquement la taille de la police avec une propriété distincte dans ma classe de données (c'est-à-dire, FontSize="{Binding FontSize}"
). Ils ont tous abouti à la même erreur que ci-dessus.
Quelqu'un sait ce que je fais mal ici?
Edit:
Merci à la réponse de Jared, je trouve ce qui suit:
La méthode semble bien, mais je dois faire une liaison qui fait référence à l'élément correct dans le DataContext pour chaque ligne, par opposition au partage d'une seule valeur pour la colonne entière.
code derrière:
fontDataGrid.DataContext = from font
in new InstalledFontCollection().Families;
XAML:
Binding="{Binding Font.Name}"
FontFamily="{Binding (FrameworkElement.DataContext).Font.Name,
RelativeSource={x:Static RelativeSource.Self}}"
En utilisant le XAML ci-dessus est clairement pas correct, parce que DataContext est la collection de polices. Mais je ne peux pas indexer la collection, puisque je ne sais pas quel est le numéro de ligne (ou le suis-je?). Y a-t-il une approche que je peux utiliser pour y parvenir?
Et une question secondaire: pourquoi l'attribut Binding semble-t-il fonctionner correctement, même sans le DataContext? Est-ce qu'il regarde plutôt ItemsSource?
Jetez un oeil à l'article de blog suivant. Il couvre en détail le problème que vous voyez. [http://blogs.msdn.com/nickkramer/archive/2006/08/18/705116.aspx](http://blogs.msdn.com/nickkramer/archive/2006/08/18/705116.aspx) Essentiellement, le problème est que DataGridTextColumn n'a aucun parent à partir duquel hériter d'une liaison, car il ne fait pas partie de l'arborescence logique ou visuelle. Vous devez configurer un contexte d'héritage afin d'accéder aux informations de liaison. Le blog que j'ai référé va dans le détail sur la façon de le faire. – JaredPar