Use the WPF DataGrid time will custom columns or bind certain properties.
But usually some problems, get less or no data.
Column properties because it is not in the logic tree and the visual tree.
At this time, the intermediate portion can be done by the proxy class.
Or placed into certain attributes bind to this class, DataGird column data can be acquired by binding.
For example custom HeaderTemplate, which data is not acquired DataContext. By this method it ( if you can modify as HeaderStyle, TagetType set in Style is DataGridColumnHeader, and modify the Template )
<FrameworkElement Width="{Binding ElementName=DT1,Path=ActualWidth}" DataContext="{Binding ElementName=DG,Path=ItemsSource}" x:Name="f1"/> <DataGrid x:Name="DG" AutoGenerateColumns="False" > <DataGrid.Columns> <DataGridTextColumn Header="课程名称" Binding="{Binding SbjName}" Width="150"> <DataGridTextColumn.HeaderTemplate> <DataTemplate> <Grid > <TextBlock Text="{Binding}" HorizontalAlignment="Center" MinHeight="50"/> </Grid> </DataTemplate> </DataGridTextColumn.HeaderTemplate> </DataGridTextColumn> <DataGridTemplateColumn> <DataGridTemplateColumn.HeaderTemplate> <DataTemplate> <Grid DataContext="{Binding Source={x:Reference f1}, Path=DataContext}"> </Grid> </DataTemplate> </DataGridTemplateColumn.HeaderTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid>
Another way is inherited Freezable
This write dependency property. Then you can get to by binding
class CD : Freezable
{
protected override Freezable CreateInstanceCore()
{
return new CD();
}
public object Data
{
get { return (object)GetValue(DataProperty); }
set { SetValue(DataProperty, value); }
}
public static readonly DependencyProperty DataProperty =DependencyProperty.Register("Data", typeof(object), typeof(CD));
}
<DataGrid x:Name="DG" AutoGenerateColumns="False" > <DataGrid.Resources> <local:CD x:Key="c" x:Name="cd" Data="{Binding ElementName=DG, Path=ItemsSource}"/> </DataGrid.Resources> <DataGrid.Columns> <DataGridTextColumn Header="课程名称" Binding="{Binding SbjName}" Width="150"> <DataGridTextColumn.HeaderTemplate> <DataTemplate> <Grid > <TextBlock Text="{Binding}" HorizontalAlignment="Center" MinHeight="50"/> </Grid> </DataTemplate> </DataGridTextColumn.HeaderTemplate> </DataGridTextColumn> <DataGridTemplateColumn> <DataGridTemplateColumn.HeaderTemplate> <DataTemplate> <Grid x:Name="G1" Tag="{Binding Source={StaticResource c }, Path=Data}"> <TextBlock Text="{Binding ElementName=G1,Path=Tag[1].SbjName}"/> </Grid> </DataTemplate> </DataGridTemplateColumn.HeaderTemplate> </DataGridTemplateColumn> </DataGrid.Columns> </DataGrid>