Поиск столбца DataGridColumn из шаблона заголовка

#wpf #xaml #data-binding

#wpf #xaml #привязка данных

Вопрос:

Как я могу найти столбец DataGridTextColumn из шаблона HeaderTemplate? Есть ли способ выполнить это, используя только XAML? Я пробовал FindAncestor типа DataGridTextColumn, но он не найден.

Я знаю, что DataGridTextColumn не является частью визуального дерева. Есть ли какой-либо обходной путь для этого?

Комментарии:

1. Можете ли вы привести нам пример того, что вы пытаетесь сделать со столбцом, и откуда вы пытаетесь получить к нему доступ в XAML?

Ответ №1:

Вам действительно нужен объект столбца целиком? DataContext будет тем, что вы передаете в качестве заголовка, например

 <DataGridTextColumn Header="Name" Binding="{Binding Name}">
    <DataGridTextColumn.HeaderTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding}" Foreground="Red" />
        </DataTemplate>
    </DataGridTextColumn.HeaderTemplate>
</DataGridTextColumn>
  

Это приведет к появлению красного заголовка с текстом «Name».

Если вам действительно нужен столбец, вы могли бы использовать ElementName привязку:

 <DataGrid ItemsSource="{Binding Data}">
    <DataGrid.Columns>
        <DataGridTextColumn x:Name="nameColumn" Header="Name" Binding="{Binding Name}">
            <DataGridTextColumn.HeaderTemplate>
                <DataTemplate>
                    <TextBlock Foreground="Red">
                        <Run Text="{Binding Mode=OneWay}" />
                        <Run Text=" - " />
                        <Run Text="{Binding ActualWidth, ElementName=nameColumn, Mode=OneWay}" />
                    </TextBlock>
                </DataTemplate>
            </DataGridTextColumn.HeaderTemplate>
        </DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>
  

Здесь отображается «Имя» и ширина столбца в заголовке.

Ответ №2:

Доступ к столбцу по индексу в datagrid с помощью find ancestor работает.

 <DataGrid ItemsSource="{Binding Data}">
<DataGrid.Columns>
    <DataGridTextColumn x:Name="nameColumn" Header="Name" Binding="{Binding Name}">
        <DataGridTextColumn.HeaderTemplate>
            <DataTemplate>
                <TextBlock Foreground="Red">
                    <Run Text="{Binding Mode=OneWay}" />
                    <Run Text=" - " />
                    <Run Text="{Binding Columns[0].ActualWidth, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Mode=OneWay}" />
                </TextBlock>
            </DataTemplate>
        </DataGridTextColumn.HeaderTemplate>
    </DataGridTextColumn>
</DataGrid.Columns>