引言

     在与DataGrid相关的项目中,会有一个比较常见的需求.那就是在根据数据设置行的样式,例如行的背景色或者字体色.我们用到的方法有几个,下面一个个说来.

准备工作

    介绍方法之前,先定义数据类,是一个比较简单的分数表,有姓名,分数等,代码如下:

  public class Score
{
public string Name { get; set; }
public int Chinese { get; set; }
public int Math { get; set; }
}

再创建个实例给datagrid赋值数据源,如下:

 this.datagrid.ItemsSource = new List<Score> { new Score { Name = "小红", Chinese = , Math =  },
new Score { Name = "小明", Chinese = , Math = },
new Score { Name = "小李", Chinese = , Math = },
new Score { Name = "小雷", Chinese = , Math = }};

1.数据触发器

最简单最方便的方法就是定义一个DataTrigger,但是缺点也很明显,只能用于单个数据绑定和判断数据是否相等的情况.例如,我们要将语文成绩等于90的数据背景色设置为绿色,代码如下

<Style >
<Style.Triggers>
<DataTrigger Binding="{Binding Chinese}" Value="">
<Setter Property="DataGridRow.Background" Value="Green"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>

2.值转换器

IValueConverter也只能应用于单数据绑定,但是它功能上强大些.例如我们要将语文成绩小于60的数据背景色设置为红色,代码如下:

定义BlackgroundConverter,如下:

    public class BlackgroundConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (int.Parse(value.ToString(), NumberStyles.Any) < )
{ return new SolidColorBrush(Colors.Red );
}
else
{
return DependencyProperty.UnsetValue;
}
} public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return DependencyProperty.UnsetValue;
}
}

定义资源

 <local:BlackgroundConverter x:Key="blackgroudconverter"></local:BlackgroundConverter>

应用转换器

<Style >
<Setter Property="DataGridRow.Background" Value="{Binding Chinese,Converter={StaticResource blackgroudconverter}}"></Setter>
</Style>

另外,还有一个更强大的值转换器IMultiValueConverter,同时绑定语文和数学成绩,可以将语文成绩大于数学成绩的数据设置为红色,如下:

public class BlackgroudMultiConver : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
try
{
int one = int.Parse(values[].ToString(), NumberStyles.Any) ;
int two = int.Parse(values[].ToString(), NumberStyles.Any); if (values[] != null && values[] != null && one > two)
{ return new SolidColorBrush(Colors.Red);
}
else
{
return DependencyProperty.UnsetValue; }
}
catch (Exception e)
{
return DependencyProperty.UnsetValue;
} } public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
return null;
} }

3.样式选择器

从功能上看,StyleSelector是上面两个的集大成者.它可以实现多个数据值的判断和应用多个属性的设置.例如,我们可以将语文成绩大于数学成绩的数据设置为红色,字体颜色设置为蓝色,代码如下:

    public class DataGridStyleSelector : StyleSelector
{ public override Style SelectStyle(object item, DependencyObject container)
{
if (item is Score)
{
Score tmp = (Score)item;
if (tmp.Chinese > tmp.Math)
{
return style;
}
else
{
return null;
}
}
else
{
return null; }
}
public Style style { get; set; }
}

定义资源

<local:DataGridStyleSelector x:Key="dataGridStyleSelector">
<local:DataGridStyleSelector.style>
<Style>
<Setter Property="DataGridRow.Background" Value="Red"></Setter>
<Setter Property="DataGridRow.Foreground" Value="Blue"></Setter>
</Style>
</local:DataGridStyleSelector.style>
</local:DataGridStyleSelector>

应用样式选择器

 <DataGrid Name="datagrid" AutoGenerateColumns="False"  RowStyleSelector="{StaticResource dataGridStyleSelector}" >

但是,样式选择器也有个不如意的地方,当我们动态编辑数据的时候,不能自动引发样式的改变.这种情况没有优雅的解决方法,只能在数据变化的时候,粗暴地将对应的样式选择器设置null再设置回来.

4.乱入:模板选择器

DataTemplateSelector同样功能很强大,它可以完全改变数据的显示方式.可惜的是,datagrid没有RowTemplateSelector.只有CellTemplateSelector,我们可以利用CellTemplateSelector对单元格做点有趣的显示,例如添加点额外的文字描述,如下

public class CellDataTemplateSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{ if (item is Score)
{
Score tmp = (Score)item;
if (tmp.Chinese >=)
{
return template1;
}
else
{
return template2;
}
}
else
{
return null; } }
public DataTemplate template1 { get; set; }
public DataTemplate template2 { get; set; }
}

定义资源

<local:CellDataTemplateSelector x:Key="celldatatemplateselector">
<local:CellDataTemplateSelector.template1>
<DataTemplate>
<TextBlock Foreground="Green" Text="{Binding Chinese,StringFormat=成绩不错:{0}}"></TextBlock>
</DataTemplate>
</local:CellDataTemplateSelector.template1>
<local:CellDataTemplateSelector.template2>
<DataTemplate>
<TextBlock Foreground="Red" Text="{Binding Chinese,StringFormat=还要努力:{0}}"></TextBlock>
</DataTemplate>
</local:CellDataTemplateSelector.template2>
</local:CellDataTemplateSelector>

应用模板选择器

  <DataGridTemplateColumn   CellTemplateSelector="{StaticResource celldatatemplateselector}" Header="语文分数">  </DataGridTemplateColumn>

同样,它有着和样式选择器同样的缺点.

小结

本文从简单到复杂介绍数据触发器,值转换器,样式选择器,模板选择器,它们有各自的应用场景,也有各自的局限性,在使用上要注意一下.最后,如果你有更好的建议,请不吝指教!

【WPF】DataGrid的Row样式设置的更多相关文章

  1. WPF DataGrid 数据绑定、样式、分页、增删改查,连接Access数据库

    先上效果图: XAML: <UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation&q ...

  2. WPF中ListBox的样式设置

    设置之后的效果为

  3. 关于C# wpf DataGrid单元格双击设置单元格内容

    1.我是使用了 visual stadio 2015, 用的C# WPF写个工具,但是发现wpf原生没有涉及表格的东西(类似 winform·的DataGridView),所以使用的是toolkit工 ...

  4. wpf 中DataGrid 控件的样式设置及使用

    本次要实现的效果为: 这个DataGrid需要绑定一个集合对象,所以要先定义一个Experience类,包含三个字段 /// <summary> /// 定义工作经历类 /// </ ...

  5. WPF DataGrid 样式设置

    隔行换色,鼠标单击,悬浮样式都有,其具体效果如图 1 所示. 图 1 WPF DataGrid 样式设置效果图 其中: 界面设计代码下所示 ? + 查看代码 1 2 3 4 5 6 7 8 9 10 ...

  6. WPF DataGrid自定义样式

    微软的WPF DataGrid中有很多的属性和样式,你可以调整,以寻找合适的(如果你是一名设计师).下面,找到我的小抄造型的网格.它不是100%全面,但它可以让你走得很远,有一些非常有用的技巧和陷阱. ...

  7. WPF DataGrid 样式分享

    原文:WPF DataGrid 样式分享 隔行换色,鼠标单击,悬浮样式都有 先看效果: 代码: <DataGrid AutoGenerateColumns="False" N ...

  8. wpf datagrid设置右键菜单打开时选中项的背景色

    原文:wpf datagrid设置右键菜单打开时选中项的背景色 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/huangli321456/artic ...

  9. WPF DataGrid某列使用多绑定后该列排序失效,列上加入 SortMemberPath 设置即可.

    WPF DataGrid某列使用多绑定后该列排序失效 2011-07-14 10:59hdongq | 浏览 1031 次  悬赏:20 在wpf的datagrid中某一列使用了多绑定,但是该列排序失 ...

随机推荐

  1. 【AWS】订阅AWS论坛的RSS消息获取最新公告

    背景:AWS在遇到系统升级.系统故障等问题的时候,会在其官方论坛发布通知,并同步到RSS 前言:我们在项目中遇到几次AWS的RDS出现故障导致系统受影响,当系统故障时,我们的监控系统会发送一堆告警出来 ...

  2. Loadrunder之脚本篇——关联

    关联的原理 关联也属于一钟特殊的参数化.一般参数化的参数来源于一个文件.一个定义的table.通过sql写的一个结果集等,但关联所获得的参数是服务器响应请求所返回的一个符合条件的.动态的值. 例子:常 ...

  3. Python学习进程(13)文件与IO

        本节介绍基本的IO函数和文件的读写操作.     (1)读取键盘输入: Python用于读取键盘输入的函数有两个:raw_input与input. 1)raw_input函数 从标准输入读取一 ...

  4. Java中的HashMap

    今天到中关村软件园面试被问到Java中HashMap的存值原理,瞬间无言已对,回答用了一个数组,然后沉默,面试官说,一次的面试失败不算什么,之后...... 1.关于hashCode hashCode ...

  5. DNS 递归/迭代 原理

    递归查询 递归:客户端只发一次请求,要求对方给出最终结果.一般客户机和服务器之间属递归查询,即当客户机向DNS服务器发出请求后,若DNS服务器本身不能解析,则会向另外的DNS服务器发出查询请求,得到结 ...

  6. display:inline-block 间隙

    IE6/7是不支持display:inline-block属性,只是让其表现的跟inline-block一样,尤其对于inline水平的元素,其表现度可以用perfect一词来形容了. 对于IE8+以 ...

  7. java实现文件的压缩和解压

    java实现文件的压缩和解压 代码压缩实现 package com.hjh.demo.zip; import java.io.BufferedInputStream; import java.io.F ...

  8. Cocos2d-x项目移植到WP8系列之五:播放MP3

    原文链接: http://www.cnblogs.com/zouzf/p/3972549.html 这一块的细节还是不太了解,只是东凑西拼能跑起来而已 1.网上下载lamb库 生成需要的lib库,详情 ...

  9. URI Is Not Registered

    使用IntelliJ Maven生成archetype时候,偶然会出现xml文件的头定义提示错误 URI is not registered 例如: 解决方法: 鼠标点击红色字,然后Intellij出 ...

  10. maven setting.xml 存放位置导致deply失败,显示没有权限401错误

    settings.xml存在于两个地方: 1.安装的地方:$M2_HOME/conf/settings.xml 2.用户的目录:${user.home}/.m2/settings.xml 我只在mav ...