27

列の 1 つがそのフォントで表示されるフォント名であるデータ グリッドを構築しようとしています。以前は、次のテンプレートを定義したリスト ボックスで作業していました。

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

これはうまくいきました。そこで、データ構造を微調整し (Name が Font.Name になりました)、データ グリッドに移動して次のことを試してみました。

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

現在、フォント名はすべてデフォルトのフォントで表示されており、次のエラーが発生します。

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

カスタム コントロールを扱ういくつかの Google の結果では、プロパティを DependencyObject から FrameworkElement に変更することが提案されていますが、そのためには DataGridTextColumn を継承し、独自のプロパティを定義する必要があります。より良い方法があるはずです。

データ クラスの個別のプロパティ (つまり、FontSize="{Binding FontSize}". それらはすべて上記と同じエラーになりました。

ここで私が間違っていることを知っている人はいますか?

編集:

Jared の返信のおかげで、次のことがわかりました。

https://docs.microsoft.com/en-us/archive/blogs/jaimer/forwarding-the-datagrids-datacontext-to-its-columns

メソッドは適切に見えますが、列全体で 1 つの値を共有するのではなく、各行の DataContext の正しい要素を参照するバインディングを作成する必要があります。

コードビハインド:

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

XAML:

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

DataContext はフォントのコレクション全体であるため、上記の XAML を使用することは明らかに正しくありません。しかし、行番号がわからない (またはわからない) ため、コレクションにインデックスを付けることはできません。これを達成するために使用できるアプローチはありますか?

2 つ目の質問として、DataContext がなくても Binding 属性が正常に機能しているように見えるのはなぜですか? 代わりに ItemsSource を見ていますか?

4

2 に答える 2

1

試す

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

プロパティが宣言されている場所をバインディング システムが見つけるのに問題が発生する場合があるため、何らかの支援が必要になります。

于 2009-02-02T14:45:40.683 に答える