2009-02-02 23 views
26

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:

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

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?

+1

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

Respuesta

21

La respuesta de Jared es correcta, pero he encontrado una solución concreta que ha resuelto mi problema.

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

Siguiendo este ejemplo, he cambiado mi definición DataGridTextColumn a:

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

y no tiene que preocuparse por la columna de heredar el DataContext. Esto me da el resultado que quiero.

1

Trate

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

veces el sistema de unión tiene problemas para encontrar donde se declara una propiedad por lo que necesita para darle un poco de ayuda.

+0

En este caso particular, FontFamily no se hereda de Control; es una propiedad en DataGridTextColumn. –

+0

Malo, lo actualizaré a TextBlock ya que debería ser lo que usará. –

+0

Todavía no va, con el mismo error original. Creo que Jared tiene la causa correcta. –

Cuestiones relacionadas