绑定在DataGrid的ColumnHeaderStyle中不起作用

时间:2017-04-10 20:54:11

标签: c# wpf datagrid background datagridcolumnheader

我只是想将Background的{​​{1}}与DataGridTemplateColumn.Header设置为自定义Binding。我可以将它明确地设置为样式中的颜色,但我需要根据某些用户首选项进行更改。我不想编写代码来挖掘并查找每个视图中每个网格中的每个标题。

我确信我错过了一些超级简单的东西,比如我没有正确地设置DependencyProperty,但我已经尝试了所有我想到的东西,但没有任何效果。我之前从未使用DataContext,所以我仍然想弄清楚很多东西。有人请告诉我我错过了什么。

XAML:

DataGrid

C#:

<Window x:Class="DataGridTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:DataGridTest"
        mc:Ignorable="d"
        Title="Data Grid Test" Height="300" Width="525"
        WindowStartupLocation="CenterScreen">
    <DataGrid Name="DataGrid1"
              AutoGenerateColumns="False"
              MaxWidth="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=Width}"
              ScrollViewer.CanContentScroll="False">
        <DataGrid.ColumnHeaderStyle>
            <Style TargetType="{x:Type DataGridColumnHeader}">
                <Setter Property="HorizontalAlignment" Value="Stretch" />
                <Setter Property="HorizontalContentAlignment" Value="Center" />
                <Setter Property="Background" Value="{Binding HeaderBackground}" />
            </Style>
        </DataGrid.ColumnHeaderStyle>
        <DataGrid.Columns>
            <DataGridTemplateColumn IsReadOnly="True" Width="*">
                <DataGridTemplateColumn.Header>
                    <ComboBox Name="CB1">
                        <ComboBoxItem Name="CBI11" Content="Choose..." IsSelected="True" />
                        <ComboBoxItem Name="CBI12" Content="First Choice" />
                        <ComboBoxItem Name="CBI13" Content="Second Choice" />
                    </ComboBox>
                </DataGridTemplateColumn.Header>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Label Content="{Binding Text1}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

            <DataGridTemplateColumn IsReadOnly="True" Width="Auto">
                <DataGridTemplateColumn.Header>
                    <ComboBox Name="CB2">
                        <ComboBoxItem Name="CBI21" Content="Choose..." IsSelected="True" />
                        <ComboBoxItem Name="CBI22" Content="First Choice" />
                        <ComboBoxItem Name="CBI23" Content="Second Choice" />
                    </ComboBox>
                </DataGridTemplateColumn.Header>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Label Content="{Binding Text2}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
</Window>

3 个答案:

答案 0 :(得分:1)

为主窗口命名。例如x:Name="MyWindow"

您已为主窗口创建了依赖属性“HeaderBackground”。因此,为了访问它,您需要使用ElementName绑定。

<DataGrid.ColumnHeaderStyle>
      <Style TargetType="{x:Type DataGridColumnHeader}">
           <Setter Property="HorizontalAlignment" Value="Stretch" />
           <Setter Property="HorizontalContentAlignment" Value="Center" />
           <Setter Property="Background" Value="{Binding ElementName=MyWindow, Path=HeaderBackground}" />
      </Style>
 </DataGrid.ColumnHeaderStyle>

enter image description here

希望这有帮助。

答案 1 :(得分:1)

您只需指定RelativeSource绑定:

<DataGrid.ColumnHeaderStyle>
    <Style TargetType="{x:Type DataGridColumnHeader}">
        <Setter Property="HorizontalAlignment" Value="Stretch" />
        <Setter Property="HorizontalContentAlignment" Value="Center" />
        <Setter Property="Background" Value="{Binding HeaderBackground, RelativeSource={RelativeSource AncestorType=Window}}" />
    </Style>
</DataGrid.ColumnHeaderStyle>

DataContext的{​​{1}}不是窗口,这就是原始绑定不起作用的原因。

您可以使用DataGridColumnHeader绑定到可视树中父元素的属性,例如父窗口。

答案 2 :(得分:0)

我将我的配色方案映射到我的视图模型中的 MasterConfiguration 类。这样我就可以即时更改它们。这对我有用。

enter image description here