【问题标题】:WPF DataGridColumn foreground color turn red if value is negative如果值为负,WPF DataGridColumn 前景色变为红色
【发布时间】:2015-01-09 16:40:56
【问题描述】:

我希望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 属性支持属性更改通知。

标签: c# wpf


【解决方案1】:

我花了几个小时寻找转换器无法工作的错误。原因是我用错了Brushes

System.Drawing.Brushes.Red;

而不是

System.Windows.Media.Brushes.Red;

【讨论】:

    【解决方案2】:

    DataGridColumn 的前景色根据其值更改,如果值为负,则颜色为红色,其他为黑色 xmal 代码是`

    <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>`
    

    viewmodel 中的代码是

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

    添加颜色集变量是模型

    public string  ColorSet { get; set; }
    

    【讨论】:

      【解决方案3】:

      因为所有常规 DataGridColumn 绑定都是相对于 DataGrid 元素的,而不是 Row。在 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>
      

      编辑:请参阅Binding in a WPF data grid text column 了解更多解决方案。

      【讨论】:

      • 您对 DataGridBoundColumn 中的绑定的假设不正确,至少请解释为什么 Binding="{Binding Change}" 有效但 Foreground="{Binding Change... 有效不是。根据您的假设,Binding="{Binding Change}" 当然不应该工作。
      • @KingKing Binding 属性的用途与单元格级别有关,而不是在列中。因此,DataGridTextColumn 类不直接使用它,而是将他的绑定表达式应用于每行自动生成的每个 TextBox。但是,您不会期望其他属性,例如,Header 属性分别从每个单元格中吸取他的上下文。英文如有乱码请见谅,感谢挑战。
      猜你喜欢
      • 2011-03-13
      • 2010-10-12
      • 2021-02-17
      • 1970-01-01
      • 2020-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-21
      相关资源
      最近更新 更多