【问题标题】:How to set DataGridTextColumn text color?如何设置 DataGridTextColumn 文本颜色?
【发布时间】:2012-06-12 15:13:38
【问题描述】:

我正在尝试更改 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')

我应该怎么做才能让它工作?

【问题讨论】:

  • 您是要为整列设置背景,还是为列中的单个单元格设置背景?
  • 我正在尝试为单个单元格设置 FOREGROUND

标签: c# wpf xaml wpfdatagrid datagridtextcolumn


【解决方案1】:

您需要为列的 CellStyle 指定带有 DataTrigger 的 Style。例如

<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>

【讨论】:

  • 处于活动状态可能为空。我该如何指定?
  • @ArsenZahray:添加了 null 触发器。我假设您的状态转换器处理空值。
  • 抱歉,我是 WPF 新手。我的代码中出现“转换器”标签未解决的符号错误,我还需要定义哪些其他代码?
  • @DannyTan Converters 是 BoolToTextConverter 的命名空间 - 不记得我是否为此创建了任何真实代码。
  • @Phil:我收到以下错误:未定义命名空间前缀“CONVERTER”。您能否添加代码以使其适用于所有人?
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 我注意到了这一点,但我的问题是,WPF 确实在 Binding 中看到了属性 IsActive 而在 Foreground 中看不到它。同时,我修改了 BoolToColorConverter 以返回实心画笔而不是颜色
    • 绑定 Column 的 Foreground 属性不起作用。
    猜你喜欢
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 2018-12-24
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多