I am trying to bind one data grid's header's width to another datagrid's headers.
So, I have added a datagrid for each row of the parent data grid. Now, I am trying to control the column size of the child data grid using the Parent header's columns.
So in the headertemplate of the last column, I added a datagrid with just Column Headers, no rows. In this column's celltemplate, I have added another datagrid, with no headers, just datarows.
Is there any way in XAML to resize the celltemplate's datagrid column when I resize the headertemplate datagrid column header.
Read alot of anwers on SO plus few posts on CodeProject etc., but I am not able to make it work. Is it possible to do?
XAML
<Grid>
<DataGrid x:Name="Test"
AutoGenerateColumns="False"
CanUserAddRows="False"
ItemsSource="{Binding AllAssets}"
CanUserResizeColumns="True">
<DataGrid.Resources>
<DataTemplate x:Key="NewKey2">
<DataGrid Name="dgC"
AutoGenerateColumns="False"
HeadersVisibility="None"
ItemsSource="{Binding months}"
CanUserResizeColumns="True">
<DataGrid.Columns>
<DataGridTextColumn x:Name="Col1" Binding="{Binding value}" />
<DataGridTextColumn x:Name="Col2" Binding="{Binding MonthName}" />
</DataGrid.Columns>
</DataGrid>
</DataTemplate>
<DataTemplate x:Key="NewKey3">
<StackPanel>
<Label HorizontalAlignment="Center">All Headers</Label>
<DataGrid Name="dgH">
<DataGrid.Columns>
<DataGridTextColumn Width="{Binding ElementName=Col1, Path=ActualWidth}" Header="Value" />
<DataGridTextColumn Width="{Binding ElementName=Col2, Path=ActualWidth}" Header="Month" />
<!--Error or no result on these attempts
<DataGridTextColumn Header="Month" Width="{Binding Source={x:Reference Col2}, Path=ActualWidth}"/>--><!--
<DataGridTextColumn >
<DataGridTextColumn.Header>
<TextBlock Width="{Binding Source={x:Reference Col1}, Path=ActualWidth}" >Value</TextBlock>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Header="Month" />-->
</DataGrid.Columns>
</DataGrid>
</StackPanel>
</DataTemplate>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTemplateColumn Header="Id">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Label Content="{Binding id}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Name">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Label Content="{Binding name}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn CellTemplate="{StaticResource NewKey2}"
HeaderTemplate="{StaticResource NewKey3}" />
</DataGrid.Columns>
</DataGrid>
</Grid>
C# Class data for example:
namespace WpfApplication1
{
public class Assets
{
public List<Asset> AllAssets { get; set; }
public Assets()
{
AllAssets = new List<Asset>();
for (int i = 1; i < 3; i++)
{
Asset asset = new Asset();
asset.id = i;
asset.name = "asset " + i.ToString();
for (int x = 1; x < 3; x++)
{
MonthsData months = new MonthsData();
months.MonthName = "Month " + x.ToString();
months.value = x;
asset.months.Add(months);
}
AllAssets.Add(asset);
}
}
}
public class Asset
{
public int id { get; set; }
public string name { get; set; }
public List<MonthsData> months { get; set; }
public Asset()
{
months = new List<MonthsData>();
}
}
public class MonthsData
{
public string MonthName { get; set; }
public int value { get; set; }
}
}