在开发的过程中有的时候会遇到一种情况,就是使用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字段的列。