如何根据绑定设置 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;
}
我想创建一种样式,使我单元格的内容在正数时为绿色,在负数时为红色,在 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;
}