I was using the VisualTreeHelper trying to locate a textBlock inside the datagrid columnHeaders. I have just learnt that : "The Header object of the DataGridColumn is actually the visible header of that column, whatever you set it to be. DataGridColumn is not part of the Visual Tree so there is not direct way to access the DataGridColumnHeader for it (we can't even be sure it exists yet)... " This has set me back by a couple of days. I tried to convert the suggested code to vb.net in order to use it but I don't seem to get it right. The code in c# is :
I ask someone who understand this c# code to apply it in my scenario shown below. I want to access in order to rename the textblock 'columnHeaderName'. How can I do this?
Thanks for helping.
Code:
ataGridColumnHeader headerObj = GetColumnHeaderFromColumn(column);
private DataGridColumnHeader GetColumnHeaderFromColumn(DataGridColumn column)
{
// dataGrid is the name of your DataGrid. In this case Name="dataGrid"
List<DataGridColumnHeader> columnHeaders = GetVisualChildCollection<DataGridColumnHeader>(dataGrid);
foreach (DataGridColumnHeader columnHeader in columnHeaders)
{
if (columnHeader.Column == column)
{
return columnHeader;
}
}
return null;
}
public List<T> GetVisualChildCollection<T>(object parent) where T : Visual
{
List<T> visualCollection = new List<T>();
GetVisualChildCollection(parent as DependencyObject, visualCollection);
return visualCollection;
}
private void GetVisualChildCollection<T>(DependencyObject parent, List<T> visualCollection) where T : Visual
{
int count = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < count; i++)
{
DependencyObject child = VisualTreeHelper.GetChild(parent, i);
if (child is T)
{
Code:
<Datagrid>
<Datagrid.Columns>
<DatagridTemplateColumn Header="header1" Width="100">
<DatagridTemplateColumn.HeaderTemplate>
<DataTemplate>
<TextBlock Name="columnHeaderName" Text="columnHeaderText" Width="100"/>
</DataTemplate>
</..........>
</Datagrid>