【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中某一列使用了多绑定,但是该列排序失 ...
随机推荐
- Latex技巧:LaTex插图命令includegraphics参数详解
Latex插图的命令是\includegraphics[选项]{文件} 这里的选项在表 7.1, 7.2, 7.3 中列出. 因为 \includegraphics 不会结束 当前段落,所以它能够在文 ...
- Maven学习笔记—坐标和依赖
Maven的坐标和依赖 1 Maven坐标 1.1 什么是Maven坐标 Maven坐标:世界上任何一组构件都可以使用Maven坐标来唯一标识,Maven坐标的元素包括groupId.artifact ...
- 剑指offer 面试62题
面试62题: 题目:圆圈中最后剩下的数字 题:0,1,...,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字. 解题思路:约瑟夫环问题,可 ...
- 插入排序 Insertion Sort
插入排序算法的运作如下: 通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入. 插入排序算法的实现我放在这里. 时间/空间复杂度: 最差时间复杂度 O(n^2) 最优时间 ...
- PsySH——PHP交互式控制台
PsySH PsySH is a runtime developer console, interactive debugger and REPL for PHP. PsySH是一个PHP的运行时开发 ...
- 每天一个Linux命令(62)rcp命令
rcp代表"remote file copy"(远程文件拷贝). (1)用法: 用法: rcp [参数] [源文件] [目标文件] (2)功能: ...
- SQL 根据IF判断,SET字段值
当INVOICE_STATUS值为1时,赋值为2,否者赋值为原来的值 UPDATE T_INVOICE SET DOWNLOAD_COUNT = DOWNLOAD_COUNT + 1, INVOICE ...
- 数据库自动增长id下一次的值
mysql SELECT auto_increment FROM information_schema.`TABLES` WHERE TABLE_SCHEMA='my_db_name' AND TAB ...
- verilog FAQ(zz)
1. What is the race condition in verilog? Ans :The situation when two expressions are allowed to exe ...
- iOS_触摸事件与手势识别
目 录: 一.触摸事件 1.1iOS的输入事件 1.2 触摸事件的处理 1.3 UITouch类中包含五个属性 1.4 UITouch类中包含两个成员函数 1.5响应者链 二.手势识别 2.1使用手 ...