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>
posted @ 2020-01-12 13:06  ARM830  阅读(646)  评论(0编辑  收藏  举报