天天看點

WPF DataGrid的可見性

使用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>