2009-02-02 4 views
26

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:

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

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?

+1

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

Répondre

21

La réponse de Jared est correcte, mais j'ai trouvé une solution concrète qui a résolu mon problème.

http://blogs.msdn.com/vinsibal/archive/2008/12/17/wpf-datagrid-dynamically-updating-datagridcomboboxcolumn.aspx

Suivant cet exemple, j'ai changé ma définition de DataGridTextColumn à:

<dg:DataGridTextColumn Binding="{Binding Font.Name}" IsReadOnly="True" Header="Font"> 
    <dg:DataGridTextColumn.ElementStyle> 
     <Style TargetType="TextBlock"> 
      <Setter Property="FontFamily" Value="{Binding Font.Name}" /> 
     </Style> 
    </dg:DataGridTextColumn.ElementStyle> 
</dg:DataGridTextColumn> 

Et je ne pas besoin de se soucier de la colonne héritant de la DataContext. Cela me donne le résultat que je veux.

1

Essayez

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

Parfois, le système de liaison a un problème pour trouver une propriété où est déclarée si vous devez lui donner un peu d'aide.

+0

Dans ce cas particulier, FontFamily n'est pas hérité de Control; c'est une propriété dans DataGridTextColumn. –

+0

Mon mauvais, je vais le mettre à jour à TextBlock puisque cela devrait être ce qu'il va utiliser. –

+0

Toujours pas aller, avec la même erreur d'origine. Je pense que Jared a la bonne cause. –

Questions connexes