【WPF】DataGrid的Row样式设置
引言
在与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样式设置的更多相关文章
- WPF DataGrid 数据绑定、样式、分页、增删改查,连接Access数据库
先上效果图: XAML: <UserControl xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation&q ...
- WPF中ListBox的样式设置
设置之后的效果为
- 关于C# wpf DataGrid单元格双击设置单元格内容
1.我是使用了 visual stadio 2015, 用的C# WPF写个工具,但是发现wpf原生没有涉及表格的东西(类似 winform·的DataGridView),所以使用的是toolkit工 ...
- wpf 中DataGrid 控件的样式设置及使用
本次要实现的效果为: 这个DataGrid需要绑定一个集合对象,所以要先定义一个Experience类,包含三个字段 /// <summary> /// 定义工作经历类 /// </ ...
- WPF DataGrid 样式设置
隔行换色,鼠标单击,悬浮样式都有,其具体效果如图 1 所示. 图 1 WPF DataGrid 样式设置效果图 其中: 界面设计代码下所示 ? + 查看代码 1 2 3 4 5 6 7 8 9 10 ...
- WPF DataGrid自定义样式
微软的WPF DataGrid中有很多的属性和样式,你可以调整,以寻找合适的(如果你是一名设计师).下面,找到我的小抄造型的网格.它不是100%全面,但它可以让你走得很远,有一些非常有用的技巧和陷阱. ...
- WPF DataGrid 样式分享
原文:WPF DataGrid 样式分享 隔行换色,鼠标单击,悬浮样式都有 先看效果: 代码: <DataGrid AutoGenerateColumns="False" N ...
- wpf datagrid设置右键菜单打开时选中项的背景色
原文:wpf datagrid设置右键菜单打开时选中项的背景色 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/huangli321456/artic ...
- WPF DataGrid某列使用多绑定后该列排序失效,列上加入 SortMemberPath 设置即可.
WPF DataGrid某列使用多绑定后该列排序失效 2011-07-14 10:59hdongq | 浏览 1031 次 悬赏:20 在wpf的datagrid中某一列使用了多绑定,但是该列排序失 ...
随机推荐
- COM 组件创建实例失败,原因是出现以下错误: c001f011 (Microsoft.SqlServer.ManagedDTS)
从 IClassFactory 为 CLSID 为 {AA40D1D6-CAEF-4A56-B9BB-D0D3DC976BA2} 的 COM 组件创建实例失败,原因是出现以下错误: c001f011. ...
- 我的第二个Python小程序
输出0-100之间的偶数: # Author: fansik # Description: Output an even number between 0 and 100 # method one n ...
- 前端基础之jquery练习
实例练习 左侧菜单 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- Python进阶(3)_进程与线程中的lock(线程中互斥锁、递归锁、信号量、Event对象、队列queue)
1.同步锁 (Lock) 当全局资源(counter)被抢占的情况,问题产生的原因就是没有控制多个线程对同一资源的访问,对数据造成破坏,使得线程运行的结果不可预期.这种现象称为“线程不安全”.在开发过 ...
- Loadrunder之脚本篇——关联函数对话框详解
Insert->New Step,打开Add Step对话框 选择函数web_reg_save_param,点击OK,打开关联函数设置窗口 说明: Parameter Name 此处设置存放参数 ...
- C++中引用编译过的C代码为什么要用“extern c”
函数经过编译系统的翻译成汇编,函数名对应着汇编标号. 因为C编译函数名与得到的汇编代号基本一样,如:fun()=>_fun, main=>_main 但是C++中函数名与得到的汇编代号 ...
- uboot相关的几篇好文
http://www.eeworld.com.cn/mcu/2015/0727/article_21246.html http://blog.csdn.net/kernel_yx/article/de ...
- python中完善decorator
@decorator可以动态实现函数功能的增加,但是,经过@decorator“改造”后的函数,和原函数相比,除了功能多一点外,有没有其它不同的地方? 在没有decorator的情况下,打印函数名: ...
- Docker容器技术-自动化部署
一.用Chef自动化部署Docker 1.为什么需要自动化部署? Docker引擎需要配置很多参数(cgroups.内存.CPU.文件系统等) 识别Docker容器运行在哪个宿主机上 耗时且容易出错, ...
- Docker容器技术-在开发中引用Docker
明确一点: 容器不适合构建那种发布周期以周或月为单位的大型单一架构企业软件,容器适合采用微服务的方式,以及探索诸如持续部署这样的技术,使得我们能安全地在一天内多次更新生产环境. 一.在开发中引用Doc ...