使用 WPF C# 更改数据网格颜色时出现问题

Problems changing datagrid color using WPF C#

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

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;
      }
   }
}

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

这是一个与 this question 类似的问题。 可以使用 datatrigger:

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

通常,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 数据网格的各个部分是出了名的困难,Microsoft 没有提供如何进行格式化的必要信息。阅读我的文章 Codeproject: Guide to WPF DataGrid formatting using binding 以更好地了解如何轻松做到这一点。