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



0 Answers

Essayer

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

Parfois, le système de reliure a du mal à trouver une propriété déclarée, vous devez donc lui donner de l'aide.

Question

J'essaie de créer 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 où j'avais défini le modèle suivant:

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

Cela a 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 Google concernant les contrôles personnalisés suggèrent de changer la propriété de DependencyObject en FrameworkElement, mais je devrais hériter de DataGridTextColumn et définir ma propre propriété pour le faire - il doit y avoir une meilleure solution.

J'ai essayé plusieurs approches différentes de la liaison, y compris essayer de modifier uniquement 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 je dois établir une liaison qui référence l'élément correct dans le DataContext pour chaque ligne, au lieu de 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}}"

L'utilisation du XAML ci-dessus n'est clairement pas correcte, car DataContext est la collection complète de polices. Mais je ne peux pas indexer la collection, car je ne sais pas quel est le numéro de ligne (ou est-ce que je le fais?). 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 que c'est regarder ItemsSource à la place?




Related