Ligação em uma coluna de texto da grade de dados WPF
Estou tentando criar uma grade de dados em que uma das colunas é um nome de fonte exibido nessa fonte. Anteriormente, eu estava trabalhando com uma caixa de listagem onde havia definido o seguinte modelo:
<TextBlock Text="{Binding Path=Name}" FontFamily="{Binding Path=Name}"/>
Isso funcionou muito bem. Então, ajustei a estrutura de dados (o nome se tornou Font.Name) e fui para uma grade de dados para tentar o seguinte:
<dg:DataGridTextColumn Binding="{Binding Font.Name}"
FontFamily="{Binding Font.Name}" IsReadOnly="True" Header="Font"/>
Agora, os nomes das fontes são todos exibidos na fonte padrão e recebo este erro:
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')
Alguns resultados do Google que lidam com controles personalizados sugerem a alteração da propriedade de DependencyObject para FrameworkElement, mas eu teria que herdar DataGridTextColumn e definir minha própria propriedade para fazer isso - deve haver uma maneira melhor.
Tentei várias abordagens diferentes para a ligação, incluindo a tentativa de alterar apenas o tamanho da fonte com uma propriedade distinta na minha classe de dados (ou seja,FontSize="{Binding FontSize}"
) Todos eles resultaram no mesmo erro acima.
Alguém sabe o que estou fazendo de errado aqui?
Editar:
Graças à resposta de Jared, encontrei o seguinte:
O método parece sólido, mas preciso fazer uma ligação que faça referência ao elemento correto no DataContext para cada linha, em vez de compartilhar um único valor para a coluna inteira.
Código por trás:
fontDataGrid.DataContext = from font
in new InstalledFontCollection().Families;
XAML:
Binding="{Binding Font.Name}"
FontFamily="{Binding (FrameworkElement.DataContext).Font.Name,
RelativeSource={x:Static RelativeSource.Self}}"
Usar o XAML acima claramente não está correto, porque DataContext é toda a coleção de fontes. Mas não consigo indexar a coleção, pois não sei qual é o número da linha (ou não?). Existe alguma abordagem que eu possa usar para conseguir isso?
E uma pergunta secundária - por que o atributo Binding parece funcionar bem, mesmo sem o DataContext? Ele está olhando para o ItemsSource?