Связывание в текстовом столбце сетки данных WPF - PullRequest
26 голосов
/ 02 февраля 2009

Я пытаюсь построить сетку данных, где один из столбцов - это имя шрифта, отображаемое в этом шрифте. Ранее я работал со списком, в котором я определил следующий шаблон:

<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}"). Все они привели к той же ошибке, что и выше.

Кто-нибудь знает, что я здесь не так делаю?

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?

Ответы [ 2 ]

22 голосов
/ 03 февраля 2009

Ответ Джареда верен, но я нашел конкретное решение, которое решило мою проблему.

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. Это дает мне желаемый результат.

1 голос
/ 02 февраля 2009

Попробуйте

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

Иногда в системе привязки возникает проблема с поиском места, где объявлено свойство, поэтому вам необходимо оказать ему некоторую помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...