使用WPF的DataGrid的時候 會自定義列或者是綁定某些屬性。
但是通常有些問題,擷取不到或者沒有資料。
因為Column是屬性是以并不在邏輯樹和視覺樹中。
此時可以通過代理類來做中間部分。
将某些屬性放置到或者綁定到這個類,DataGird的列在通過綁定就可以擷取資料。
例如自定義HeaderTemplate,裡面的資料則是不可以擷取DataContext。通過此方法就可以了(如果可以盡可能修改HeaderStyle,Style中的TagetType設定為DataGridColumnHeader,并修改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>
另外一種方式是繼承Freezable
這樣可以寫依賴屬性。再通過綁定就可以擷取到
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>