绑定和样式化DataGridColumnHeader

时间:2013-10-09 15:58:46

标签: c# wpf

我有一个像这样的DataGridColumn:

<DataGridTextColumn
    Binding="{Binding
        Path=Name,
        UpdateSourceTrigger=PropertyChanged}"
    HeaderStyle="{StaticResource HeaderWrapped}">

    <DataGridTextColumn.HeaderTemplate>
        <DataTemplate>
            <TextBlock
                Text="{Binding
                    Path=DataContext.Name,
                    RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" />
        </DataTemplate>
    </DataGridTextColumn.HeaderTemplate>
</DataGridTextColumn>

HeaderWrapped样式位于控件中导入的ResourceDictionary中。它看起来像这样:

<Style x:Key="HeaderWrapped" TargetType="DataGridColumnHeader">
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <TextBlock TextWrapping="Wrap" Text="{TemplateBinding Content}" />
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>

当我运行应用程序时,标题文本被正确绑定,但未设置TextWrapping。我猜测DataGridTextColumn.HeaderTemplate会覆盖我的ResourceDictionary中的模板。有没有办法可以保持ResourceDictionary中标题的样式,但仍然绑定标题的Text属性?

1 个答案:

答案 0 :(得分:1)

你要做的是基本上首先为标题设置样式,然后告诉它忘记它并使用标题的全新模板。您无法同时设置DataGridTextColumn.HeaderStyle.ContentTemplateDataGridTextColumn.HeaderTemplate

但是我可以想到这个问题的一个解决方法:

<DataGridTextColumn
    Binding="{Binding
        Path=Name,
        UpdateSourceTrigger=PropertyChanged}"
    Tag="{Binding 
         Path=DataContext.Name,
         RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}"
    HeaderStyle="{StaticResource HeaderWrapped}">
</DataGridTextColumn>

<Style x:Key="HeaderWrapped" TargetType="DataGridColumnHeader">
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <TextBlock TextWrapping="Wrap" Text="{TemplateBinding Tag}" />
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>