[.net] Liaison dans une colonne de texte de la grille de données WPF


Answers

Essayer

TextBlock.FontFamily="{Binding Font.Name}"

Parfois, le système de liaison a un problème pour trouver une propriété déclarée, vous devez donc lui donner de l'aide.

Question

J'essaye de construire une grille de données où l'une des colonnes est un nom de police affiché dans cette police. Auparavant, je travaillais avec une zone de liste dans laquelle j'avais défini le modèle suivant:

<TextBlock Text="{Binding Path=Name}" FontFamily="{Binding Path=Name}"/>

Cela a très bien fonctionné. Donc, j'ai modifié la structure de données (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 police sont tous affichés dans la police par défaut, et j'obtiens 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 de Google traitant des contrôles personnalisés suggèrent de changer la propriété de DependencyObject à FrameworkElement, mais je devrais hériter de DataGridTextColumn et définir ma propre propriété pour le faire - il doit y avoir une meilleure façon.

J'ai essayé plusieurs approches différentes de la liaison, y compris tenter de changer juste la taille de la police avec une propriété distincte dans ma classe de données (par exemple, FontSize="{Binding FontSize}" ). Ils ont tous abouti à la même erreur que ci-dessus.

Quelqu'un sait ce que je fais mal ici?

Modifier:

Grâce à la réponse de Jared, j'ai trouvé ce qui suit:

http://blogs.msdn.com/jaimer/archive/2008/11/22/forwarding-the-datagrid-s-datacontext-to-its-columns.aspx

La méthode semble saine, mais j'ai besoin de faire une liaison qui référence l'élément correct dans le DataContext pour chaque ligne, par opposition à partager 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}}"

Il est clair que l'utilisation du code XAML ci-dessus n'est pas correcte, car DataContext est l'intégralité de 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?