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字段的列。

posted on 2013-01-25 23:08  梅贤军  阅读(2554)  评论(0编辑  收藏  举报

导航