2009-02-02 8 views
26

Ich versuche, ein Datenraster zu erstellen, wobei eine der Spalten ein Schriftart-Name in dieser Schriftart angezeigt wird. Zuvor arbeitete ich mit einem Listenfeld, in dem ich die folgende Vorlage definiert hatte:Binding in einer WPF-Datenraster Textspalte

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

Dies funktionierte einwandfrei. Also, ich gezwickt die Datenstruktur (Name wurde Font.Name) und bewegt auf einem Datenraster, dies zu versuchen:

<dg:DataGridTextColumn Binding="{Binding Font.Name}" 
    FontFamily="{Binding Font.Name}" IsReadOnly="True" Header="Font"/> 

Nun sind die Font-Namen alle in der Standardschrift angezeigt werden, und ich bekomme diese Fehlermeldung:

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') 

einige Ergebnisse Google mit benutzerdefinierten Kontrollen Umgang empfiehlt die Eigenschaft von DependencyObject Framework zu ändern, aber ich habe erben und Datagridtextcolumn meine eigene Eigenschaft zu definieren, dies zu tun - es muss ein besserer Weg geben.

Ich habe mehrere verschiedene Ansätze für die Bindung versucht, einschließlich der Versuch, nur die Schriftgröße mit einer eigenen Eigenschaft in meiner Datenklasse (d. H. FontSize="{Binding FontSize}") zu ändern. Sie haben alle denselben Fehler wie oben ergeben.

Wer weiß, was ich hier falsch mache?

Edit:

Dank Jared Antwort, fand ich folgendes:

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

Das Verfahren sieht Sound, aber ich brauche eine Bindung, die Referenzen das richtige Element in der machen DataContext für jede Zeile, anstatt einen einzelnen Wert für die gesamte Spalte zu teilen.

-Code hinter:

fontDataGrid.DataContext = from font 
    in new InstalledFontCollection().Families; 

XAML:

Binding="{Binding Font.Name}" 
FontFamily="{Binding (FrameworkElement.DataContext).Font.Name, 
    RelativeSource={x:Static RelativeSource.Self}}" 

deutlich die oben XAML ist nicht korrekt, da die Datacontext gesamte Sammlung von Schriften. Aber ich kann die Sammlung nicht indizieren, da ich nicht weiß, was die Zeilennummer ist (oder nicht?). Gibt es einen Ansatz, mit dem ich das erreichen kann?

Und eine zweite Frage - warum scheint das Binding-Attribut gut zu funktionieren, auch ohne den DataContext? Betrachtet es stattdessen ItemsSource?

+1

Werfen Sie einen Blick auf den folgenden Blogpost. Es behandelt detailliert das Problem, das Sie sehen. [http://blogs.msdn.com/nickcramer/archive/2006/08/18/705116.aspx](http://blogs.msdn.com/nickkamer/archive/2006/08/18/705116.aspx) Im Wesentlichen besteht das Problem darin, dass die DataGridTextColumn-Klasse kein übergeordnetes Element hat, von dem eine Bindung übernommen werden kann, da sie nicht Teil der logischen oder visuellen Struktur ist. Sie müssen einen Vererbungskontext einrichten, um Zugriff auf die Bindungsinformationen zu erhalten. Der Blog, auf den ich Bezug genommen habe, geht ausführlich darauf ein. – JaredPar

Antwort

21

Jareds Antwort ist korrekt, aber ich habe eine konkrete Lösung gefunden, die mein Problem gelöst hat.

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

Diesem Beispiel folgend, änderte ich meine Datagridtextcolumn Definition:

<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> 

Und ich brauche nicht über die Spalte der Datacontext erben zu kümmern. Dies gibt mir das gewünschte Ergebnis.

1

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

manchmal ein Problem zu finden, hat das Bindungssystem Versuchen Sie, wo eine Eigenschaft deklariert wird, so dass Sie ihm etwas Hilfe geben müssen.

+0

In diesem speziellen Fall wird FontFamily nicht von Control geerbt. Es ist eine Eigenschaft in DataGridTextColumn. –

+0

Mein Problem, ich werde es auf TextBlock aktualisieren, da das sein sollte, was es verwenden wird. –

+0

Immer noch nicht mit demselben ursprünglichen Fehler. Ich denke Jared hat den richtigen Grund. –