设置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
。
您的方法似乎完全不适用于我。然而,我确实使用这部分绑定DataTriger:'Column.DisplayIndex,RelativeSource = {RelativeSource Self}' 这似乎选择结果的整个列与正确的值,并更改背景,这是更接近我是之前。是否有可能只改变具有正确值的单元格的背景? – PL200
@ PL200目前它只改变一个单元格,而不是整列/行。 – AnjumSKhan
所以'状态'是列标题,是吗?有没有办法做到这一点所有列? – PL200