如何根据绑定设置 DataGridCell 内容的样式而不命名该绑定

How can I style a DataGridCell's content based on binding without naming that binding

我想创建一种样式,使我单元格的内容在正数时为绿色,在负数时为红色,在 0 时为黑色。

我知道转换器和绑定,但是否可以在不命名特定列绑定到的字段的情况下执行此操作(例如,我要基于单元格的值)?

            <Style x:Key="GreenIfPositive" TargetType="DataGridCell" BasedOn="{StaticResource {x:Type DataGridCell}}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding, Converter={StaticResource greaterThanZeroDecimalConverter}}" Value="True">
                        <Setter Property="Foreground" Value="Green"/>
                    </DataTrigger>
                    <DataTrigger BBinding="{Binding, Converter={StaticResource greaterThanZeroDecimalConverter}}" Value="False">
                        <Setter Property="Foreground" Value="Red"/>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding}" Value="0">
                        <Setter Property="Foreground" Value="Black"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>

这样我就可以在列上使用它而无需重新迭代该样式,这样我就可以 select 属性 我以此为基础。

这是 DataGridTextColumn 的解决方案。 DataGridTextColumn 创建 TextBlock 元素来显示单元格值。 TextBlock 有字符串 Text 属性。这些 TextBlock 可以通过 DataGridCell Content 属性 访问,因此生成的绑定路径是 "Content.Text"

<Style.Triggers>
    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, 
                 Path=Content.Text, Mode=OneWay,
                 Converter={StaticResource greaterThanZeroDecimalConverter}}" 
                 Value="True">
        <Setter Property="Foreground" Value="Green"/>
    </DataTrigger>
    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, 
                 Path=Content.Text, Mode=OneWay,
                 Converter={StaticResource greaterThanZeroDecimalConverter}}" 
                 Value="False">
        <Setter Property="Foreground" Value="Red"/>
    </DataTrigger>
    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, 
                 Path=Content.Text, Mode=OneWay}" 
                 Value="0">
        <Setter Property="Foreground" Value="Black"/>
    </DataTrigger>
</Style.Triggers>

注意{RelativeSource Self}

我还必须更改 Convert 方法,因为文本是一个字符串 属性 并且传入的值是字符串。

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    double d;
    if (value != null && value is string && double.TryParse(value.ToString(), out d))
    {
        return d > 0;
    }
    return null;
}