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