【问题标题】:How can I style a DataGridCell's content based on binding without naming that binding如何在不命名该绑定的情况下基于绑定设置 DataGridCell 内容的样式
【发布时间】:2018-08-17 00:44:04
【问题描述】:

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

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

【问题讨论】:

    标签: wpf binding styles converter


    【解决方案1】:

    这是DataGridTextColumns 的解决方案。 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 方法,因为 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;
    }
    

    【讨论】:

    • 谢谢,好主意!我只需要还原 Path 和 RelativeSource。这可能是特定于 Visual Studio 版本的问题,但您的解决方案却抱怨不支持嵌套类型。 &lt;DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=Content.Text, Converter={StaticResource greaterThanZeroDecimalConverter}}" Value="True"&gt; 创造了奇迹。只需编辑它,我会接受你的回答;)
    • @BenoitDufresne,按请求固定
    猜你喜欢
    • 1970-01-01
    • 2011-03-30
    • 2011-11-23
    • 2015-08-10
    • 2012-11-30
    • 2021-10-30
    • 1970-01-01
    • 2016-01-15
    相关资源
    最近更新 更多