最近要用wpf写程序,要改变datagrid的单元格颜色,根据条件改变颜色
废话不多说了,直接代码吧,都是很简单的代码。
准备工作:添加一个颜色的值转换器。我这里写在window的资源文件了,只这个窗口使用。可以根据实际情况添加。(这个之前代码里面有,博客里写掉了,感谢 xhh325的提问)
<Window.Resources>
<local:ColorConvert x:Key="ColorConvert"/>
</Window.Resources>
首先,datagrid控件设置好,主要是数据绑定,和值转换
<my:DataGrid AutoGenerateColumns="False" Margin="10,10,10,10" Name="dataGrid" >
<my:DataGrid.CellStyle >
<Style TargetType="my:DataGridCell">
<Style.Triggers >
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="White"></Setter>
<Setter Property="Foreground" Value="Black"/>
<Setter Property="BorderThickness" Value="0"></Setter>
</Trigger>
<Trigger Property="IsSelected" Value="False">
<Setter Property="Background" Value="White"></Setter>
<Setter Property="Foreground" Value="Black"/>
<Setter Property="BorderThickness" Value="0"></Setter>
</Trigger>
</Style.Triggers>
</Style>
</my:DataGrid.CellStyle>
<my:DataGrid.Columns>
<my:DataGridTemplateColumn Header="xxx" >
<my:DataGridTemplateColumn.CellTemplate>
<DataTemplate >
<TextBlock Text="{Binding xxx}" Background="{Binding Path=xxx,Converter={StaticResource colorConvert}}" Foreground="Black" />
</DataTemplate>
</my:DataGridTemplateColumn.CellTemplate>
</my:DataGridTemplateColumn>
</my:DataGrid.Columns>
</my:DataGrid>
然后,根据条件写好值转换器就行了
namespace xxx
{
//定义值转换器
[ValueConversion(typeof(string), typeof(string))]
public class ColorConvert : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
string strValue = value.ToString();
if (strValue == "红色警报")
{
return "Red";
}
return "White";
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return "";
}
}
}
总结一下,主要注意3点:
1、根据条件定义一个值转换颜色的类
2、在xaml利用定义值转换类的静态资源,方面后面使用
3、绑定数据
之前,我很多博客都是直接代码,没有很多文章描述,也没有完整例子,因为我通常只看关键技术点,然后能把这些东西拼凑成我想要的(这些博客主要是想对自己以后的方便吧)。
今天看到xhh325留言说有异常,至于什么原因引起的,我不知道他的代码,也不清楚什么原因。于是,总结了上面3个关键点吧,并写了个简单的小例子(http://download.csdn.net/source/3461165),以供参考。
在我刚编辑完博客不久,xhh325又提出的新的要求:DataGrid需要动态绑定一个DataTable数据源,而且DataTabel的列是不确定的,需要根据最后一列的内容判定颜色,”完成“显示绿色,其它显示红色
其实,主要是把xaml写的代码,换成c#的,如下:
// 初始化dataGrid2
void InitDataGrid2()
{
// 知道动态得到的dt,动态显示到datagrid
int colCount = dt.Columns.Count;
for (int i = 0; i < colCount; ++i )
{
string colName = dt.Columns[i].ToString();
DataGridTemplateColumn column = new DataGridTemplateColumn();
column.Header = colName;
DataTemplate dataTemplate = new DataTemplate();
FrameworkElementFactory tbContent = new FrameworkElementFactory(typeof(TextBlock));
// 设置内容
tbContent.SetValue(TextBlock.TextProperty, new Binding(colName));
// 文字颜色
tbContent.SetValue(TextBlock.ForegroundProperty, Brushes.Black);
// 背景颜色
Binding bindBackColor = new Binding(colName);
bindBackColor.Converter = new ColorConvert();
tbContent.SetValue(TextBlock.BackgroundProperty, bindBackColor);
// 单元格长度,用浮点数。3.5版本下用整数会异常,其他版本不清楚
tbContent.SetValue(TextBlock.WidthProperty, 100.0);
dataTemplate.VisualTree = tbContent;
column.CellTemplate = dataTemplate;
dataGrid2.Columns.Add(column);
}
}
至于他的要求,我就不写了。根据上面改一改就可以了。新上传的例子:http://download.csdn.net/source/3462049(http://alsmile.download.csdn.net/)