WPF DataGrid将什么绑定到标头DataTemplate?

n7taea2i  于 2023-02-05  发布在  其他
关注(0)|答案(2)|浏览(203)

创建WPF DataGrid时,我可以选择将DataTemplate设置为每列的HeaderTemplate,如下所示:

<DataGridTextColumn Binding="{Binding Name}">
    <DataGridTextColumn.HeaderTemplate>
        <DataTemplate>

            <!-- just some random content, not important, but notice the bindings use RelativeSource-->
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="Name" VerticalAlignment="Center"/>
                <Button Command="{Binding Path=DataContext.SortFoldersByNameCommand, RelativeSource={RelativeSource AncestorType=DataGrid}}" Content="▲" 
                    Foreground="{Binding Path=DataContext.IsFoldersSortByName, Converter={StaticResource EnabledToBrushConverter}, RelativeSource={RelativeSource AncestorType=DataGrid}}"/>
            </StackPanel>

        </DataTemplate>
    </DataGridTextColumn.HeaderTemplate>
</DataGridTextColumn>

现在,请注意,要使绑定在该模板中工作,我需要设置一个RelativeSource,因为该模板不再绑定到网格的DataContext
问题是:* * 什么绑定到头的DataTemplate**?
例如,如果我简单地尝试输入一个<TextBlock Text="{Binding}"/>,文本是空的,我不知道我还能做什么其他类型的测试来找出答案。

rqqzpn5f

rqqzpn5f1#

简短的回答是,数据上下文什么都不是。
我在磁盘上的一些数据网格中添加了一个快速模板。
几年前我用这个回答过几个问题。
标头不在可视化树中,并且不继承datacontext。
我的快速和肮脏的标题模板:

<DataGridTextColumn Binding="{Binding LastName}">
                <DataGridTextColumn.HeaderTemplate>
                    <DataTemplate>
                        <TextBlock Text="XXXX"/>
                    </DataTemplate>
                </DataGridTextColumn.HeaderTemplate>
            </DataGridTextColumn>

使用Snoop检查该文本块...
数据上下文为空:

这就是为什么你要做所有的相对源的事情来得到你在数据上下文中的属性。
顺便说一句。
如果您正在进行大量的wpf开发,我建议您给予一下Snoop。
它还是比内置的好得多。

lymnna71

lymnna712#

除了使用Snoop(很棒的工具!)之外,您还可以通过向绑定添加转换器并使用断点检查它来检查它。(如果绑定为null,则检查是必要的,这种情况就是如此)
Path=.表示当前的DataContext

<DataGridTextColumn.HeaderTemplate>
    <DataTemplate>
        <TextBlock Text="{Binding Path=., Converter={local:TestConverter}}"/>
    </DataTemplate>
</DataGridTextColumn.HeaderTemplate>

其中,转换器定义为:

class TestConverter : MarkupExtension, IValueConverter
{
    //source to target
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value.GetType().FullName;
    }

    //target to source
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }
}

相关问题