我只是想将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>
答案 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>
希望这有帮助。
答案 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)