Связывание в текстовом столбце таблицы данных WPF
Я пытаюсь построить сетку данных, где один из столбцов - это имя шрифта, отображаемое в этом шрифте. Раньше я работал со списком, в котором я определил следующий шаблон:
<TextBlock Text="{Binding Path=Name}" FontFamily="{Binding Path=Name}"/>
Все прошло отлично. Итак, я изменил структуру данных (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}"
). Все они привели к той же ошибке, что и выше.
Кто-нибудь знает, что я здесь делаю неправильно?
Edit:
Спасибо Джареду, я нашел следующее:
http://blogs.msdn.com/jaimer/archive/2008/11/22/forwarding-the-datagrid-s-datacontext-to-its-columns.aspx
Метод выглядит здорово, но мне нужно сделать привязку, которая ссылается на правильный элемент в 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 вместо этого?
Ответы
Ответ 1
Ответ Джареда верен, но я нашел конкретное решение, которое решило мою проблему.
http://blogs.msdn.com/vinsibal/archive/2008/12/17/wpf-datagrid-dynamically-updating-datagridcomboboxcolumn.aspx
Следуя этому примеру, я изменил определение DataGridTextColumn на:
<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>
И мне не нужно беспокоиться о столбце, наследующем DataContext. Это дает мне результат, который я хочу.
Ответ 2
Попробуйте
TextBlock.FontFamily="{Binding Font.Name}"
Иногда в системе привязки возникает проблема с поиском, где объявляется свойство, поэтому вам нужно дать ему некоторую помощь.