第一种方法,指定 DataGrid 里单元格的值是否符合用户自定义的条件,如果不,改变指定的颜色:
前台XAML代码:.
<Window x:Class="WpfDataGridCellColors.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:loca="clr-namespace:WpfDataGridCellColors"Title="MainWindow" Height="261" Width="649"><Window.Resources><loca:ColorConverter x:Key="MyColorConvert"/></Window.Resources><Grid><DataGrid x:Name="dataGrid"CanUserDeleteRows="False" CanUserAddRows="False"AutoGenerateColumns="False" IsReadOnly="True"Background="White" GridLinesVisibility="All" Margin="5"ScrollViewer.VerticalScrollBarVisibility="Visible"ScrollViewer.HorizontalScrollBarVisibility="Visible"HeadersVisibility="Column" AlternationCount="2"><DataGrid.Columns><DataGridTextColumn Binding="{Binding Title}" Header="项目" Width="150"/><DataGridTemplateColumn Width="150" ><DataGridTemplateColumn.HeaderTemplate><DataTemplate><TextBlock Text="A" /></DataTemplate></DataGridTemplateColumn.HeaderTemplate><DataGridTemplateColumn.CellTemplate><DataTemplate><TextBlock Text="{Binding IA}" VerticalAlignment="Center"HorizontalAlignment="Center" Foreground="{Binding IA,Converter={StaticResource MyColorConvert}}"/></DataTemplate></DataGridTemplateColumn.CellTemplate></DataGridTemplateColumn><DataGridTemplateColumn Width="150" ><DataGridTemplateColumn.HeaderTemplate><DataTemplate><TextBlock Text="B"/></DataTemplate></DataGridTemplateColumn.HeaderTemplate><DataGridTemplateColumn.CellTemplate><DataTemplate><TextBlock Text="{Binding IB}" VerticalAlignment="Center"HorizontalAlignment="Center" Foreground="{Binding IB,Converter={StaticResource MyColorConvert}}"/></DataTemplate></DataGridTemplateColumn.CellTemplate></DataGridTemplateColumn><DataGridTemplateColumn Width="150" ><DataGridTemplateColumn.HeaderTemplate><DataTemplate><TextBlock Text="C" /></DataTemplate></DataGridTemplateColumn.HeaderTemplate><DataGridTemplateColumn.CellTemplate><DataTemplate><TextBlock Text="{Binding IC}" VerticalAlignment="Center"HorizontalAlignment="Center" Foreground="{Binding IC,Converter={StaticResource MyColorConvert}}"/></DataTemplate></DataGridTemplateColumn.CellTemplate></DataGridTemplateColumn></DataGrid.Columns></DataGrid></Grid></Window>
这里要注意的是定义DataGrid的列模板,首先是列标题模块:
<DataGridTemplateColumn.HeaderTemplate><DataTemplate><TextBlock Text="A" /></DataTemplate></DataGridTemplateColumn.HeaderTemplate>
然后是列的单元格模板:
<DataGridTemplateColumn.CellTemplate><DataTemplate><TextBlock Text="{Binding IA}" VerticalAlignment="Center"HorizontalAlignment="Center" Foreground="{Binding IA,Converter={StaticResource MyColorConvert}}"/></DataTemplate></DataGridTemplateColumn.CellTemplate>
这里的Foreground绑定后台生成的值 IA ,当IA符合用户定义的一些条件后,改变颜色。
条件判断与颜色转变在下面的IValueConverter类中。
(如果要改变单元格的背景颜色,只需把前台XAML中的Foreground改为Background即可)
后台代码:
namespace WpfDataGridCellColors{/// <summary>/// MainWindow.xaml 的交互逻辑/// </summary>public partial class MainWindow : Window{private List<Contrasts> _ContrastList;public List<Contrasts> ContrastList{get { return _ContrastList; }set{_ContrastList = value;}}public MainWindow(){InitializeComponent();ContrastList = new List<Contrasts>();ContrastList.Add(new Contrasts(){Title = "减数",IA = 110,AFColor = Brushes.Black,IB = 220,BFColor = Brushes.Black,IC = 330,CFColor = Brushes.Green});dataGrid.ItemsSource = ContrastList;}}public class Contrasts{private string _Title;public string Title{get { return _Title; }set { _Title = value; }}private double _IA;public double IA{get { return _IA; }set { _IA = value; }}private double _IB;public double IB{get { return _IB; }set { _IB = value; }}private double _IC;public double IC{get { return _IC; }set { _IC = value; }}private SolidColorBrush _AFColor;public SolidColorBrush AFColor{get { return _AFColor; }set { _AFColor = value; }}private SolidColorBrush _BFColor;public SolidColorBrush BFColor{get { return _BFColor; }set { _BFColor = value; }}private SolidColorBrush _CFColor;public SolidColorBrush CFColor{get { return _CFColor; }set { _CFColor = value; }}}}IValueConverter类:using System;using System.Collections.Generic;using System.Windows.Data;using System.Windows;namespace WpfDataGridCellColors{public class ColorConverter : IValueConverter{public object Convert(object value, Type typeTarget, object param, System.Globalization.CultureInfo culture){if (value == null){return "Black";}if (System.Convert.ToDouble(value) >= 100.0 && System.Convert.ToDouble(value) < 200){return "Black";}if (System.Convert.ToDouble(value) >= 200.0 && System.Convert.ToDouble(value) < 300){return "Green";}if (System.Convert.ToDouble(value) >= 300.0){return "Red";}return "Black";}public object ConvertBack(object value, Type typeTarget, object param, System.Globalization.CultureInfo culture){return "";}}}