设置DataGrid单元格背景

问题描述:

(有围绕这一话题类似的问题,但没有真正符合我已经走了这件事的方式。)设置DataGrid单元格背景

我想改变颜色每个DataGrid的单元格基于它们的值(一个整数,从0到3)。 目前,我能够通过鼠标操作,以此来更改单元格的颜色:

 <DataGrid Name="mapDisplay" ItemsSource="{Binding}" Margin="0,59,10,0"> 
      <DataGrid.CellStyle> 
       <Style TargetType="DataGridCell"> 
        <Style.Triggers> 
         <Trigger Property="IsMouseOver" Value="True"> 
          <Setter Property="Background" Value="Red" /> 
         </Trigger> 
        </Style.Triggers> 
       </Style> 
      </DataGrid.CellStyle> 
     </DataGrid> 

这段代码改变任何鼠标滑过细胞“红色”。但是,我怎么能根据它的价值来改变颜色?

请参考Change DataGrid cell colour based on values这个答案。

我尝试了与答案中描述的相同的方式,下面的代码和它的工作正常。

<Window.Resources>   
     <local:ColorConverter x:Key="NameToBrushConverter"/> 
</Window.Resources> 

    <Grid> 
     <DataGrid ItemsSource="{Binding SampleList}" AutoGenerateColumns="False"> 
      <DataGrid.Columns> 
       <!-- Inputs --> 
       <DataGridTextColumn Width="SizeToCells" Header="Inputs" MinWidth="100" Binding="{Binding RowNum}" >     

        <DataGridTextColumn.ElementStyle> 
         <Style TargetType="{x:Type TextBlock}"> 
          <Setter Property="Background" Value="{Binding RowNum, Converter={StaticResource NameToBrushConverter}}"/> 
         </Style> 
        </DataGridTextColumn.ElementStyle> 

       </DataGridTextColumn> 
      </DataGrid.Columns> 
     </DataGrid> 
    </Grid> 

转换器代码:

public class ColorConverter : IValueConverter 
    { 
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
     { 
      var input = int.Parse(value.ToString()); 
      switch (input) 
      { 
       case 1: 
        return Brushes.LightGreen; 
       case 2: 
        return Brushes.LightBlue; 
       case 3: 
        return Brushes.Yellow; 
       default: 
        return DependencyProperty.UnsetValue; 
      } 
     } 

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

希望这有助于。

如果您的值范围是有限的,您可以使用下面的apparoach在XAML中执行此操作。下面的代码假定您的属性名称为Status : int,并且您只想更改包含的单元格,而不是整个行。而不是DisplayIndex,你可以Header属性也使用Column名称。

<DataGrid x:Name="Dgrd"> 
     <DataGrid.CellStyle> 
      <Style TargetType="DataGridCell"> 
       <Style.Triggers> 
        <MultiDataTrigger> 
         <MultiDataTrigger.Conditions> 
          <Condition Binding="{Binding Status}" Value="0"/> 
          <Condition Binding="{Binding Column.DisplayIndex,RelativeSource={RelativeSource Self}}" Value="1"/> 
         </MultiDataTrigger.Conditions> 
         <Setter Property="Background" Value="Blue"/> 
        </MultiDataTrigger> 
        <MultiDataTrigger> 
         <MultiDataTrigger.Conditions> 
          <Condition Binding="{Binding Status}" Value="1"/> 
          <Condition Binding="{Binding Column.DisplayIndex,RelativeSource={RelativeSource Self}}" Value="1"/> 
         </MultiDataTrigger.Conditions> 
         <Setter Property="Background" Value="Red"/> 
        </MultiDataTrigger> 
        <MultiDataTrigger> 
         <MultiDataTrigger.Conditions> 
          <Condition Binding="{Binding Status}" Value="2"/> 
          <Condition Binding="{Binding Column.DisplayIndex,RelativeSource={RelativeSource Self}}" Value="1"/> 
         </MultiDataTrigger.Conditions> 
         <Setter Property="Background" Value="Yellow"/> 
        </MultiDataTrigger> 
        <MultiDataTrigger> 
         <MultiDataTrigger.Conditions> 
          <Condition Binding="{Binding Status}" Value="3"/> 
          <Condition Binding="{Binding Column.DisplayIndex,RelativeSource={RelativeSource Self}}" Value="1"/> 
         </MultiDataTrigger.Conditions> 
         <Setter Property="Background" Value="Olive"/> 
        </MultiDataTrigger> 
       </Style.Triggers> 
      </Style> 
     </DataGrid.CellStyle> 
    </DataGrid> 

你也可以使用一个Converter

+0

您的方法似乎完全不适用于我。然而,我确实使用这部分绑定DataTriger:'Column.DisplayIndex,RelativeSource = {RelativeSource Self}' 这似乎选择结果的整个列与正确的值,并更改背景,这是更接近我是之前。是否有可能只改变具有正确值的单元格的背景? – PL200

+0

@ PL200目前它只改变一个单元格,而不是整列/行。 – AnjumSKhan

+0

所以'状态'是列标题,是吗?有没有办法做到这一点所有列? – PL200