DataGrid根据值改变行样式-DataTrigger触发器
在开发的过程中有的时候会遇到一种情况,就是使用DataGrid来显示数据,显示数据的同时,我们会想让数据根据不同的值显示出不同的样式。
WPF中有了这样的东西,叫做触发器,触发器中有这么一种叫做数据触发器(DataTrigger) ,它的作用是,根据一个值,做相应的事情。
我现在要实现的是通过MVVM模式的操作,使用DataGrid来显示人员类集合的数据,然后当大于年龄(Age)23的行的字体显示为红色。
本来,DataTrigger触发器只能支持等于操作。
下面的代码的作用是,当值等于23的时候DataGridRow行的字体颜色为红色。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
< Style TargetType = "{x:Type DataGridRow}" > < Style.Triggers > < DataTrigger Binding = "{Binding Age}" Value = "23" > < Setter Property = "ToolTip" > < Setter.Value > < ToolTip > < TextBlock Text = "{Binding Age,StringFormat='年龄:{0}超出'}" /> </ ToolTip > </ Setter.Value > </ Setter > < Setter Property = "Foreground" Value = "Red" /> </ DataTrigger > </ Style.Triggers > </ Style > |
想要操作等于以外的情况时,只能自己写一个值转换类,继承IValueConverter 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
namespace dataGrid_binding.ViewModel { public class AgeConverter : IValueConverter { public object Convert( object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { int v = 0, p = 0; int .TryParse(value.ToString(), out v); int .TryParse(parameter.ToString(), out p); return v > p; } public object ConvertBack( object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } } } |
以下的内容写在Xaml页面上。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
< Window x:Class = "dataGrid_binding.MainWindow" xmlns:VM = "clr-namespace:dataGrid_binding.ViewModel" Title = "MainWindow" Height = "395" Width = "713" > < Window.Resources > < VM:StudentViewModel x:Key = "ViewModel" /> < VM:AgeConverter x:Key = "AgeConvert" /> < Style TargetType = "{x:Type DataGridRow}" > < Style.Triggers > < DataTrigger Binding = "{Binding Age,Converter={StaticResource AgeConvert},ConverterParameter=22}" Value = "True" > < Setter Property = "ToolTip" > < Setter.Value > < ToolTip > < TextBlock Text = "{Binding Age,StringFormat='年龄:{0}超出'}" /> </ ToolTip > </ Setter.Value > </ Setter > < Setter Property = "Foreground" Value = "Red" /> </ DataTrigger > </ Style.Triggers > </ Style > </ Window.Resources > ... |
1
|
< DataTrigger Binding = "{Binding Age,Converter={StaticResource AgeConvert},ConverterParameter=22}" Value = "True" > |
上面这句的意思就是Binding了数据Age,转换这个值,对应上面的值转换类,当值大于ConverterParameter传过去的值的时候,做操作。 这个样式就对应了DataGrid中绑定了Age字段的列。