如何基于绑定设置数据网格单元内容的样式,而不命名该绑定



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

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

这里是DataGridTextColumn的解决方案。 DataGridTextColumn创建TextBlock元素来显示单元格值。文本块具有字符串Text属性。这些 TextBlocks 可以通过 DataGridCellContent属性访问,因此生成的绑定路径是"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;
}

最新更新