如何设置DataGridTextColumn文本颜色?

时间:2012-06-08 14:35:20

标签: c# wpf xaml wpfdatagrid datagridtextcolumn

我正在尝试更改DataGridTextColumn的颜色。

这就是我正在做的事情:

<DataGridTextColumn 
    Header="Status" 
    Binding="{Binding IsActive, 
               Converter= {StaticResource BoolToStatusConverter}}"
    Foreground="{Binding Path=IsActive,
               Converter={StaticResource BoolToColorConverter}}"/>

文本设置正确,但颜色不会改变,我收到以下错误:

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or 
FrameworkContentElement for target element. BindingExpression:Path=IsActive; 
DataItem=null; target element is 'DataGridTextColumn' (HashCode=40349079); target 
property is 'Foreground' (type 'Brush')

我应该怎样做才能发挥作用?

3 个答案:

答案 0 :(得分:13)

您需要为列的CellStyle指定带有DataTrigger的样式。 e.g。

<Page.Resources>
    <Style TargetType="DataGridCell" x:Key="ActiveCellStyle">
        <Setter Property="Foreground" Value="Blue"/>
        <Style.Triggers>
            <DataTrigger Binding="{Binding IsActive}" Value="{x:Null}">
                <Setter Property="Foreground" Value="Green"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding IsActive}" Value="True">
                <Setter Property="Foreground" Value="Red"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
    <Converters:BoolToTextConverter 
        x:Key="BoolToStatusConverter" 
        TargetCondition="True" 
        IsMatchValue="It's active" 
        IsNotMatchValue="It's dead" />
</Page.Resources>
<Grid>
    <DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn 
                Header="Status" 
                Binding="{Binding IsActive, 
                    Converter={StaticResource BoolToStatusConverter}}" 
                CellStyle="{StaticResource ActiveCellStyle}"/>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

答案 1 :(得分:8)

虽然从技术上讲不是DataGridTextColumn,但这正是我通常所做的:

<DataGridTemplateColumn Header="Status" SortMemberPath="Status">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Status}" Foreground="{Binding Status, Converter={StaticResource StatusToSolidColor}}" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

我得到了我想要的datacontext,我可以在应用程序的其余部分中重用我可能已经存在的转换器。此外,我不需要硬编码/维护一组额外的样式和数据触发器来获得所需的效果。

答案 2 :(得分:0)

前景是画笔,而不是颜色。它可以解析 XAML中的颜色,但是在使用转换器创建绑定时不会使用它。

使用BoolToBrushConverter,或创建一个SolidColorBrush作为前景,并将其“Color”属性绑定到BoolToColorConverter。像这样:

<DataGridTextColumn Header="Status">
    <DataGridTextColumn.Foreground>
        <SolidColorBrush Color="{Binding Path=IsActive, Converter={StaticResource BoolToColorConverter}}" />
    </DataGridTextColumn.Foreground>
</DataGridTextColumn>