Estoy intentando construir una cuadrícula de datos donde una de las columnas es un nombre de fuente que se muestra en esa fuente. Previamente, estaba trabajando con un cuadro de lista donde había definido la siguiente plantilla:Encuadernación en una columna de texto de cuadrícula de datos de WPF
<TextBlock Text="{Binding Path=Name}" FontFamily="{Binding Path=Name}"/>
Esto funcionó bien. Así, pellizqué la estructura de datos (Nombre convirtió Font.Name) y se trasladó a una cuadrícula de datos para probar esto:
<dg:DataGridTextColumn Binding="{Binding Font.Name}"
FontFamily="{Binding Font.Name}" IsReadOnly="True" Header="Font"/>
Ahora los nombres de fuente se visualizan todos de la fuente predeterminada, y me sale este error:
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')
unos resultados de Google que se ocupan de los controles personalizados sugerir cambiar la propiedad de DependencyObject a FrameworkElement, pero que tendría que heredar DataGridTextColumn y definir mi propiedad para hacerlo - debe haber una mejor manera.
He intentado varios enfoques diferentes para el enlace, incluido el intento de cambiar solo el tamaño de fuente con una propiedad distinta en mi clase de datos (es decir, FontSize="{Binding FontSize}"
). Todos han resultado en el mismo error que el anterior.
¿Alguien sabe lo que estoy haciendo mal aquí?
Editar:
Gracias a la respuesta de Jared, he encontrado lo siguiente:
El método busca el sonido, pero tengo que hacer una unión que hace referencia al elemento correcto en el DataContext para cada fila, en lugar de compartir un solo valor para toda la columna.
Código atrá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}}"
Usando el XAML anterior claramente no es correcto, porque DataContext es la colección completa de las fuentes. Pero no puedo indexar la colección, ya que no sé cuál es el número de fila (¿o sí?). ¿Hay algún enfoque que pueda usar para lograr esto?
Y una pregunta secundaria: ¿por qué el atributo de enlace parece funcionar bien, incluso sin el DataContext? ¿Está mirando ItemsSource en su lugar?
Eche un vistazo a la siguiente publicación de blog. Cubre en detalle el problema que está viendo. [http://blogs.msdn.com/nickkramer/archive/2006/08/18/705116.aspx](http://blogs.msdn.com/nickkramer/archive/2006/08/18/705116.aspx) Básicamente, el problema es que DataGridTextColumn no tiene ninguno de los padres para heredar un enlace porque no forma parte del árbol lógico o visual. Debe configurar un contexto de herencia para obtener acceso a la información de enlace. El blog al que hice referencia entra en detalles sobre cómo hacer esto. – JaredPar