如果满足某个数据条件,如何为DataGrid单元格背景设置动画?

时间:2011-11-29 18:38:47

标签: wpf animation datagrid

我有一个从数据库填充的WPF DataGrid。有一个细胞给我一个计数。如果它的值大于0,我想为该单元格添加闪烁的背景颜色。感谢您帮助解决我的问题。

1 个答案:

答案 0 :(得分:12)

创建一个转换器,检查单元格是否包含大于0的数字:

namespace MyApp
{
    public class GreaterThanZeroConverter : IValueConverter
    {
        public object Convert(object value, Type targetType,
            object parameter, CultureInfo culture)
        {
            int cellValue;
            return Int32.TryParse((string)value, out cellValue) && cellValue > 0;
        }

        public object ConvertBack(object value, Type targetType,
            object parameter, CultureInfo culture)
        {
            return false;
        }
    }
}

在xaml中包含转换器命名空间。将MyApp替换为转换器的命名空间:

xmlns:myApp="clr-namespace:MyApp"

您的网格必须看起来像这样。我绑定的对象有2个属性:Col1和Col2。如果Col1的值大于0,则该单元格将闪烁红色。

<DataGrid ItemsSource="{Binding List}" AutoGenerateColumns="False">
    <DataGrid.Resources>
        <myApp:GreaterThanZeroConverter 
            x:Key="GreaterThanZeroConverter">
        </myApp:GreaterThanZeroConverter>
        <Style TargetType="DataGridCell" x:Key="FlashStyle">
            <Style.Triggers>
                <DataTrigger 
                    Binding="{Binding Col1, 
                    Converter={StaticResource GreaterThanZeroConverter}}" 
                    Value="True" >
                    <DataTrigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard 
                                x:Name="Blink" 
                                AutoReverse="True" 
                                RepeatBehavior="Forever">
                                <ColorAnimationUsingKeyFrames 
                                    BeginTime="00:00:00"
                                    Storyboard.TargetProperty="(Background).(SolidColorBrush.Color)">
                                    <EasingColorKeyFrame 
                                        KeyTime="00:00:01" 
                                        Value="Red" />
                                </ColorAnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                    </DataTrigger.EnterActions>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.Resources>
    <DataGrid.Columns>
        <DataGridTextColumn 
            Binding="{Binding Col1}" 
            CellStyle="{StaticResource FlashStyle}"></DataGridTextColumn>
        <DataGridTextColumn 
            Binding="{Binding Col2}"></DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>

修改

如果必须根据它们包含的内容使多个列中的单元格闪烁,则可以更改

<DataTrigger 
    Binding="{Binding Col1, 
    Converter={StaticResource GreaterThanZeroConverter}}" 
    Value="True" >
  ...

<DataTrigger 
    Binding="{Binding 
        Content.Text,
        RelativeSource={RelativeSource Self},
        Converter={StaticResource GreaterThanZeroConverter}}" 
    Value="True" >

为要闪烁的FlashStyle的每一列设置CellStyle:

<DataGrid.Columns>
    <DataGridTextColumn 
        Binding="{Binding Col1}" 
        CellStyle="{StaticResource FlashStyle}"></DataGridTextColumn>
    <DataGridTextColumn 
        Binding="{Binding Col2}"
        CellStyle="{StaticResource FlashStyle}"></DataGridTextColumn>
</DataGrid.Columns>

请注意,这可能只适用于DataGridTextColumns。如果您正在使用DataGridTemplateColumns,那将会更棘手。