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