使用 WPF C# 更改数据网格颜色的问题

Posted

技术标签:

【中文标题】使用 WPF C# 更改数据网格颜色的问题【英文标题】:Problems changing datagrid color using WPF C# 【发布时间】:2018-03-12 10:01:39 【问题描述】:

我正在使用数据网格并根据行的条件更改行的颜色,并且我正在以编程方式执行此操作。 根据例子 由于我的数据网格绑定到数据表,因此我直接从数据表加载信息

private void UpdateCor () 

gvDados.UpdateLayout ();
for (int i = 0; i <dt.Rows.Count; i ++)

      var rowContext = (DataGridRow) 
      gvDados.ItemContainerGenerator.ContainerFromIndex (i);

      if (rowContext! = null)
      
            if (dt.Rows [i] ["situation"]. ToString (). Equals (1))
                     rowContext.Background = Brushes.Green;
            else
                     rowContext.Background = Brushes.Red;
      
   

有了这个我可以更新我的网格的颜色,即使它不是最好的方法。我的问题是,每当我使用滚动条向下或向上移动时,颜色都会过时。我该如何防止这种情况发生?即使我滚动条,颜色也保持不变?

【问题讨论】:

此链接 :datatrigger on enum to change image 可能会对您有所帮助。可能只需要设置背景颜色 这是因为虚拟化。您正在尝试做的是一个非常糟糕的主意,可能无法使工作正确。您应该在 XAML 中使用样式和触发器执行此操作。 Stack Overflow 上有很多例子。但是使用谷歌搜索;这里的搜索功能不是很好。 【参考方案1】:

XAML 通常过于简单,无法表达更复杂的条件。我更喜欢将哪些值应该使用哪些颜色的逻辑放入转换器中。这为 C# 中的转换器带来了更简单的 XAML 和更大的灵活性。

<datagrid.rowstyle>
  <style targettype="DataGridRow">
    <Setter Property="Background" Value="Binding RelativeSource=RelativeSource Self,
      Path=Item.situation, Converter=StaticResource ValueToBackgroundConverter"/>
  </style>
</datagrid.rowstyle>

在 C# 中:

class ValueToBackgroundConverter: IValueConverter 
  public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    if (value is int) 
      int quantity = (int)value;
      if (quantity>=100) return Brushes.White;
      if (quantity>=10) return Brushes.WhiteSmoke;
      if (quantity>=0) return Brushes.LightGray;
      return Brushes.White; //quantity should not be below 0
    
    //value is not an integer. Do not throw an exception
    // in the converter, but return something that is obviously wrong
    return Brushes.Yellow;
  

  public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    throw new NotImplementedException();
   

格式化 WPF Datagrid 的各个部分是出了名的困难,Microsoft 没有提供如何做到这一点的必要信息。阅读我的文章Codeproject: Guide to WPF DataGrid formatting using binding 以更好地了解如何轻松完成。

【讨论】:

【参考方案2】:

这是与this question 类似的问题。 可以使用数据触发器完成:

 <DataGrid ItemsSource="Binding YourItemsSource">
        <DataGrid.RowStyle>
            <Style TargetType="DataGridRow"> 
                <Style.Triggers>
                    <DataTrigger Binding="Binding State" Value="State1">
                        <Setter Property="Background" Value="Red"></Setter>
                    </DataTrigger>
                    <DataTrigger Binding="Binding State" Value="State2">
                        <Setter Property="Background" Value="Green"></Setter>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </DataGrid.RowStyle>
    </DataGrid>

【讨论】:

以上是关于使用 WPF C# 更改数据网格颜色的问题的主要内容,如果未能解决你的问题,请参考以下文章

C# WPF 根据数据更改 DataGrid 行(背景)颜色

使用 WPF 数据网格时如何更改列标题的背景颜色

如何以编程方式更改 WPF 中的数据网格行颜色?

如何在 WPF 中更改数据网格标题样式或元素样式前景

WPF使用转换器更改datagrid单元格背景颜色

选择后更改整个数据网格行的背景颜色