2016-09-17 88 views
0

(有圍繞這一話題類似的問題,但沒有真正符合我已經走了這件事的方式。)設置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> 

這段代碼改變任何鼠標滑過細胞「紅色」。但是,我怎麼能根據它的價值來改變顏色?

回答

2

請參考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(); 
     } 
    } 

希望這有助於。

1

如果您的值範圍是有限的,您可以使用下面的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

相關問題