基于数据网格单元格背景的值(C#,WPF)设置数据网格单元格背景
(围绕这个话题也有类似的问题,但没有一个与我的回答方式相匹配。) 我想根据数据网格中每个单元格的值(从0到3的整数)更改它们的颜色。 目前,我可以通过鼠标移动来改变单元格的颜色,使用以下方法:基于数据网格单元格背景的值(C#,WPF)设置数据网格单元格背景,c#,wpf,xaml,datagrid,C#,Wpf,Xaml,Datagrid,(围绕这个话题也有类似的问题,但没有一个与我的回答方式相匹配。) 我想根据数据网格中每个单元格的值(从0到3的整数)更改它们的颜色。 目前,我可以通过鼠标移动来改变单元格的颜色,使用以下方法: <DataGrid Name="mapDisplay" ItemsSource="{Binding}" Margin="0,59,10,0"> <DataGrid.CellStyle> <Style Ta
<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>
此代码将鼠标悬停在单元格上的任何内容更改为“红色”。但是如何根据颜色的值来改变颜色呢?请参考此答案
我用下面的代码尝试了答案中描述的相同方法,效果很好
<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>
希望这有帮助。请参考此答案
我用下面的代码尝试了答案中描述的相同方法,效果很好
<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>
希望这有帮助。如果您的值范围有限,您可以使用下面的apparoach在XAML中完成。下面的代码假定您的属性名为
Status:int
,您只想更改包含的单元格,而不是整行。除了DisplayIndex
,您还可以使用标题
属性来使用列
名称
<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>
您还可以使用
转换器
如果您的值范围是有限的,您可以使用下面的apparoach在XAML中进行转换。下面的代码假定您的属性名为Status:int
,您只想更改包含的单元格,而不是整行。除了DisplayIndex
,您还可以使用标题
属性来使用列
名称
<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>
您也可以使用
转换器
您的方法似乎并不完全适合我。然而,我确实使用了这个部分来绑定DataTriger:Column.DisplayIndex,RelativeSource={RelativeSource Self}
这似乎用正确的值选择了结果的整个列,并更改了背景,这比我之前更接近。是否可以使其仅更改具有正确值的单元格的背景?@PL200当前仅更改一个单元格,而不是整个列/行。因此“状态”将是列标题,是吗?是否有办法对所有列执行此操作?@PL200而不是Column.DisplayIndex
使用Column.Header
并使用状态作为Value
进行比较。您的方法似乎对我并不完全有效。然而,我确实使用了这个部分来绑定DataTriger:Column.DisplayIndex,RelativeSource={RelativeSource Self}
这似乎用正确的值选择了结果的整个列,并更改了背景,这比我之前更接近。是否可以使其仅更改具有正确值的单元格的背景?@PL200当前仅更改一个单元格,而不是整个列/行。因此“状态”将是列标题,是吗?是否有办法对所有列执行此操作?@PL200而不是Column.DisplayIndex
使用Column.Header
并使用状态作为Value
进行比较。