По-прежнему нет, с той же первоначальной ошибкой. Я думаю, что у Джареда есть правильная причина.
аюсь построить сетку данных, где один из столбцов - это имя шрифта, отображаемое этим шрифтом. Ранее я работал со списком, в котором я определил следующий шаблон:
<TextBlock Text="{Binding Path=Name}" FontFamily="{Binding Path=Name}"/>
Это работало просто отлично. Итак, я настроил структуру данных (имя стало Font.Name) и перешел на сетку данных, чтобы попробовать это:
<dg:DataGridTextColumn Binding="{Binding Font.Name}"
FontFamily="{Binding Font.Name}" IsReadOnly="True" Header="Font"/>
Теперь все имена шрифтов отображаются шрифтом по умолчанию, и я получаю эту ошибку:
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')
В нескольких результатах Google, касающихся пользовательских элементов управления, предлагается изменить свойство с DependencyObject на FrameworkElement, но для этого мне нужно унаследовать DataGridTextColumn и определить собственное свойство - должен быть лучший способ.
Я пробовал несколько разных подходов к привязке, в том числе пытался изменить только размер шрифта с помощью отдельного свойства в моем классе данных (т.е.FontSize="{Binding FontSize}"
). Все они привели к той же ошибке, что и выше.
Кто-нибудь знает, что я здесь делаю не так?
Редактировать:
Благодаря ответу Джареда я нашел следующее:
Метод выглядит здравым, но мне нужно сделать привязку, которая ссылается на правильный элемент в DataContext для каждой строки, а не на использование одного значения для всего столбца.
Код позади:
fontDataGrid.DataContext = from font
in new InstalledFontCollection().Families;
XAML:
Binding="{Binding Font.Name}"
FontFamily="{Binding (FrameworkElement.DataContext).Font.Name,
RelativeSource={x:Static RelativeSource.Self}}"
Использование вышеуказанного XAML явно не правильно, потому что DataContext - это целая коллекция шрифтов. Но я не могу проиндексировать коллекцию, так как я не знаю, что такое номер строки (или я?). Есть ли какой-то подход, который я могу использовать для достижения этой цели?
И дополнительный вопрос - почему атрибут Binding работает нормально, даже без DataContext? Это смотрит на ItemsSource вместо этого?