根据附加 属性 更改 DataGrid 列的背景颜色
Change background colour of a DataGrid column based on attached property
我正在尝试设置 DataGrid
的样式,以便如果列有附加的 属性 以指示它是否突出显示。因此,Highlighted = true
列中的那些单元格与 Highlighted = false
的列具有不同的颜色。
我的附件属性看起来像:
public static class Highlighted
{
public static bool GetIsHighlighted(DependencyObject obj)
{
return (bool)obj.GetValue(IsHighlightedProperty);
}
public static void SetIsHighlighted(DependencyObject obj, bool value)
{
obj.SetValue(IsHighlightedProperty, value);
}
public static readonly DependencyProperty IsHighlightedProperty =
DependencyProperty.RegisterAttached("IsHighlighted", typeof(bool), typeof(Highlighted), new UIPropertyMetadata(false));
}
DataGridCell
样式如下:
<Style x:Key="WeldOfficeDataGridCell" TargetType="{x:Type DataGridCell}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridCell}">
<Border BorderBrush="{x:Static SystemColors.ActiveBorderBrush}"
BorderThickness="0.5"
Background="FloralWhite" SnapsToDevicePixels="True">
<ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
ContentStringFormat="{TemplateBinding ContentStringFormat}"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
VerticalAlignment="Center"
Margin="15,5,5,5" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="attachedProperties:Highlighted.IsHighlighted" Value="True">
<Setter Property="Background">
<Setter.Value>
<SolidColorBrush Color="Red" />
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background">
<Setter.Value>
<SolidColorBrush Color="{DynamicResource AccentColor2}" />
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>
我将 DataGrid
中的 属性 设置为:
<DataGrid Margin="27,17,0,0"
Grid.Column="1"
ItemsSource="{Binding FilterableBaseMaterials}"
AutoGenerateColumns="False"
SelectionMode="Single"
HeadersVisibility="Column"
CanUserAddRows="False"
CanUserDeleteRows="False"
CanUserResizeRows="False"
Background="{x:Null}">
<DataGrid.Resources>
<helpers:BindingProxy x:Key="proxy" Data="{Binding}" />
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTemplateColumn Header="Specification" IsReadOnly="True" attachedProperties:Highlighted.IsHighlighted="True">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock HorizontalAlignment="Left" Text="{Binding Specification}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
...
但经过几个令人沮丧的小时后,我无法弄清楚如何让它工作,我的 Style.Trigger
对于附加的 属性 是错误的,因为它永远不会触发颜色的变化,我想是因为我将 属性 附加到列而不是 DataGridCell
但我不知道如何让它工作,任何帮助将不胜感激。
您正在设置 列 的附加 属性 IsHighlighted
。这与在 单元格 上设置它不同。
您应该将它设置在最终由该列创建的单元格上。在纯 XAML 中执行此操作的唯一方法是为列定义一个 CellStyle
:
<DataGridTemplateColumn Header="Specification" IsReadOnly="True">
<DataGridTemplateColumn.CellStyle>
<Style TargetType="DataGridCell" BasedOn="{StaticResource WeldOfficeDataGridCell}">
<Setter Property="attachedProperties:Highlighted.IsHighlighted" Value="True" />
</Style>
</DataGridTemplateColumn.CellStyle>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock HorizontalAlignment="Left" Text="{Binding Specification}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
我正在尝试设置 DataGrid
的样式,以便如果列有附加的 属性 以指示它是否突出显示。因此,Highlighted = true
列中的那些单元格与 Highlighted = false
的列具有不同的颜色。
我的附件属性看起来像:
public static class Highlighted
{
public static bool GetIsHighlighted(DependencyObject obj)
{
return (bool)obj.GetValue(IsHighlightedProperty);
}
public static void SetIsHighlighted(DependencyObject obj, bool value)
{
obj.SetValue(IsHighlightedProperty, value);
}
public static readonly DependencyProperty IsHighlightedProperty =
DependencyProperty.RegisterAttached("IsHighlighted", typeof(bool), typeof(Highlighted), new UIPropertyMetadata(false));
}
DataGridCell
样式如下:
<Style x:Key="WeldOfficeDataGridCell" TargetType="{x:Type DataGridCell}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridCell}">
<Border BorderBrush="{x:Static SystemColors.ActiveBorderBrush}"
BorderThickness="0.5"
Background="FloralWhite" SnapsToDevicePixels="True">
<ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
ContentStringFormat="{TemplateBinding ContentStringFormat}"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
VerticalAlignment="Center"
Margin="15,5,5,5" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="attachedProperties:Highlighted.IsHighlighted" Value="True">
<Setter Property="Background">
<Setter.Value>
<SolidColorBrush Color="Red" />
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background">
<Setter.Value>
<SolidColorBrush Color="{DynamicResource AccentColor2}" />
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>
我将 DataGrid
中的 属性 设置为:
<DataGrid Margin="27,17,0,0"
Grid.Column="1"
ItemsSource="{Binding FilterableBaseMaterials}"
AutoGenerateColumns="False"
SelectionMode="Single"
HeadersVisibility="Column"
CanUserAddRows="False"
CanUserDeleteRows="False"
CanUserResizeRows="False"
Background="{x:Null}">
<DataGrid.Resources>
<helpers:BindingProxy x:Key="proxy" Data="{Binding}" />
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTemplateColumn Header="Specification" IsReadOnly="True" attachedProperties:Highlighted.IsHighlighted="True">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock HorizontalAlignment="Left" Text="{Binding Specification}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
...
但经过几个令人沮丧的小时后,我无法弄清楚如何让它工作,我的 Style.Trigger
对于附加的 属性 是错误的,因为它永远不会触发颜色的变化,我想是因为我将 属性 附加到列而不是 DataGridCell
但我不知道如何让它工作,任何帮助将不胜感激。
您正在设置 列 的附加 属性 IsHighlighted
。这与在 单元格 上设置它不同。
您应该将它设置在最终由该列创建的单元格上。在纯 XAML 中执行此操作的唯一方法是为列定义一个 CellStyle
:
<DataGridTemplateColumn Header="Specification" IsReadOnly="True">
<DataGridTemplateColumn.CellStyle>
<Style TargetType="DataGridCell" BasedOn="{StaticResource WeldOfficeDataGridCell}">
<Setter Property="attachedProperties:Highlighted.IsHighlighted" Value="True" />
</Style>
</DataGridTemplateColumn.CellStyle>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock HorizontalAlignment="Left" Text="{Binding Specification}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>