2009-02-02 12 views
26

Sto provando a creare una griglia di dati in cui una delle colonne è un nome di carattere visualizzato in quel font. In precedenza, stavo lavorando con una casella di riepilogo in cui avevo definito il seguente modello:Associazione in una colonna di testo della griglia di dati WPF

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

Questo ha funzionato bene. Così, ho ottimizzato la struttura dati (nome divenne Font.Name) e si è trasferito su una griglia di dati per provare questo:

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

Ora i nomi dei caratteri sono tutti visualizzati nel carattere predefinito, e ottengo questo errore:

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

alcuni risultati di Google si occupano di controlli personalizzati suggeriscono modificando la proprietà da DependencyObject a FrameworkElement, ma avrei dovuto ereditare DataGridTextColumn e definire la mia proprietà a farlo - ci deve essere un modo migliore.

Ho provato diversi approcci al binding, incluso il tentativo di modificare solo la dimensione del carattere con una proprietà distinta nella mia classe di dati (ad esempio, FontSize="{Binding FontSize}"). Hanno tutti avuto lo stesso errore di cui sopra.

Qualcuno sa cosa sto facendo male qui?

Modifica:

Grazie alla risposta di Jared, ho trovato il seguente:

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

Il metodo è in buone condizioni, ma ho bisogno di fare un legame che fa riferimento l'elemento corretto nel DataContext per ogni riga, anziché condividere un singolo valore per l'intera colonna.

codice dietro:

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

XAML:

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

Utilizzando il codice XAML sopra chiaramente non è corretto, perché DataContext è l'intera collezione di font. Ma non posso indicizzare la collezione, dal momento che non so quale sia il numero di riga (o io?). C'è qualche approccio che posso usare per raggiungere questo obiettivo?

E una domanda secondaria: perché l'attributo Binding sembra funzionare correttamente, anche senza DataContext? Sta invece guardando ItemsSource?

+1

Dai un'occhiata al seguente post sul blog. Copre dettagliatamente il problema che stai vedendo. [Http://blogs.msdn.com/nickkramer/archive/2006/08/18/705116.aspx](http://blogs.msdn.com/nickkramer/archive/2006/08/18/705116.aspx) Essenzialmente il problema è che DataGridTextColumn non ha un genitore da cui ereditare un Binding perché non fa parte dell'albero logico o visivo. È necessario impostare un contesto di ereditarietà per ottenere l'accesso alle informazioni di associazione. Il blog a cui ho fatto riferimento entra nei dettagli su come farlo. – JaredPar

risposta

21

La risposta di Jared è corretta, ma ho trovato una soluzione concreta che ha risolto il mio problema.

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

Seguendo questo esempio, ho cambiato la mia definizione 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> 

E non ho bisogno di preoccuparsi per la colonna di ereditare il DataContext. Questo mi dà il risultato che voglio.

1

Prova

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

A volte il sistema di rilegatura ha un problema a trovare in cui una proprietà viene dichiarata quindi è necessario dargli un po 'di aiuto.

+0

In questo caso particolare, FontFamily non viene ereditata da Control; è una proprietà in DataGridTextColumn. –

+0

Il mio male, lo aggiornerò a TextBlock dal momento che dovrebbe essere quello che userà. –

+0

Ancora no go, con lo stesso errore originale. Penso che Jared abbia la giusta causa. –

Problemi correlati