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

时间:2017-09-30 20:26:54

标签: c# wpf datagrid wpfdatagrid

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

加载信息
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;
      }
   }
}

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

2 个答案:

答案 0 :(得分:1)

这是与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>

答案 1 :(得分:1)

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

<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,以便更好地了解如何轻松完成。