如果值为负数,WPF DataGridColumn前景色变为红色

5
我希望 DataGridColumn 的前景色能够根据其值进行更改。
<DataGridTextColumn x:Name="Diff1" 
                    Binding="{Binding Change}" Header="Net Chng" 
                    Width="*" IsReadOnly="True"
                    Foreground="{Binding Change,Converter={StaticResource negativeToColor}}">
</DataGridTextColumn>

和转换器
public class negativeToColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        SolidColorBrush brush = new SolidColorBrush(Colors.LimeGreen);
        double doubleValue = 0.0;
        Double.TryParse(value.ToString(), out doubleValue);

        if (doubleValue < 0)
            brush = new SolidColorBrush(Colors.Red);

        return brush;
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

但是转换器没有任何效果。

在此输入图片说明


在Convert方法上设置一些断点。确保“Change”属性支持属性更改通知。 - King King
3个回答

6

这是因为所有常规的DataGridColumn绑定相对于DataGrid元素而不是行。在DataGrid级别上没有名为Change的属性,只有在行级别上才有。

解决方法是:使用DataGridTemplateColumn

<DataGridTemplateColumn Header="Net Chng" Width="*" IsReadOnly="True">
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Change}" Foreground="{Binding Change, Converter={StaticResource negativeToColorConverter}}" />
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

编辑:请参考WPF数据网格文本列中的绑定获取更多解决方案。


你对于 DataGridBoundColumn 中的绑定做出的假设是不正确的,至少请解释一下为什么 Binding="{Binding Change}" 能够工作,但是 Foreground="{Binding Change... 却不能。根据你的假设,Binding="{Binding Change}" 当然是不应该能够工作的。 - King King
@KingKing Binding 属性的目的与单元格级别相关,而非列级别。因此,DataGridTextColumn 类不直接使用它,而是将其绑定表达式应用于每一行的每个自动生成的文本框。但是,其余属性则不会从每个单元格中独立地获取上下文,例如 Header 属性等。如果我的英语表述有问题,还请见谅,并感谢你的提问。 - dovid

1
如果值为负,则数据网格列的前景颜色将变为红色,否则为黑色。XAML 代码为:

<Local:AlphabetTextColumn 
                        Header="  Contribution %"
                         x:Name="SalesaAmount2"
                        Binding="{Binding salesContribution}"                        
                        >

                    <DataGridTextColumn.ElementStyle>
                        <Style TargetType="{x:Type TextBlock}">
                            <Setter Property="Foreground" Value="{Binding ColorSet}" />                         
                        </Style>
                    </DataGridTextColumn.ElementStyle>
                </Local:AlphabetTextColumn>`

视图模型中的代码是:

 if(model.salesContribution<0)
{
model.ColorSet="Red";
}
else
{
model.ColorSet="Black";
}

添加colorset变量是模型

public string  ColorSet { get; set; }

0

我花了数小时来寻找错误,原因是我使用了错误的Brushes

System.Drawing.Brushes.Red;

替代

System.Windows.Media.Brushes.Red;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接