#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>