【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中某一列使用了多绑定,但是该列排序失 ...
随机推荐
- MyISAM VS InnoDB
A.构成上的区别: InnoDB只在磁盘上存储一个文件.frm 每个MyISAM在磁盘上存储成三个文件.第一个文件的名字以表的名字开始,扩展名指出文件类型: 文 ...
- 005-MYSQL数据库设计原则
1.核心原则 不在数据库做运算; cpu计算务必移至业务层; 控制列数量(字段少而精,字段数建议在20以内); 平衡范式与冗余(效率优先:往往牺牲范式) 拒绝3B(拒绝大sql语句:big sql.拒 ...
- OpenCV3计算机视觉+python(三)
使用OpenCV3处理图像 下面要介绍的内容都与图像处理有关,这时需要修改图像,比如要使用具有艺术性的滤镜.外插(extrapolate)某些部分.分割.粘贴或其他需要的操作. 不同色彩空间的转换 O ...
- python常用模块——os模块
python编程时,经常和文件.目录打交道,这就离不开os模块,os模块包含普遍的操作系统功能,与具体的平台无关,列举一些常用的命令. 1.os.name:字符串指示你正在使用的平台.windows是 ...
- text_field text_tag 用法
= f.text_field :tax_category_id, :value => @invoice.tax_category.name, :class => "form-co ...
- 【HackerRank】Bus Station
有n组好朋友在公交车站前排队.第i组有ai个人.还有一辆公交车在路线上行驶.公交车的容量大小为x,即它可以同时运载x个人. 当车站来车时(车总是空载过来),一些组从会队头开始走向公交车. 当然,同一组 ...
- MySQL运维问题集锦
1.莫名的慢查询问题.解决思路:http://hidba.org/?spm=5176.153233.793262.6.d75LDx&p=1119
- Django---Blog系统开发之注册页面(验证码&ajax发送文件)
前端页面及渲染: 静态文件的配置:setting.py: static 文件放在app下 STATIC_URL = '/static/' STATIC_ROOT = ( os.path.join(BA ...
- linux之下载工具wget
常用格式:wget options URL -b, --background 启动后转入后台执行 -c, --continue 接着下载没下载完的文件 - ...
- Hadoop程序基础模板
分布式编程相对复杂,而Hadoop本身蒙上大数据.云计算等各种面纱,让很多初学者望而却步.可事实上,Hadoop是一个很易用的分布式编程框架,经过良好封装屏蔽了很多分布式环境下的复杂问题,因此,对普通 ...