如何在不命名绑定的情况下基于绑定来设置DataGridCell内容的样式

时间:2017-08-15 20:51:23

标签: wpf binding styles converter

我想创建一种样式,使得我的单元格内容为绿色(如果为正,红色为负数)或黑色(如果为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>

这样我就可以在列上使用它而无需重新迭代该样式,这样我就可以选择我所依据的属性。

1 个答案:

答案 0 :(得分:2)

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

<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方法,因为Text是字符串属性,传入值是字符串。

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