在Tar​​getUpdated事件上为DataGrid单元格背景设置动画

时间:2013-01-07 15:35:23

标签: wpf binding datagrid

我一直在寻找解决方案,但发现没有任何效果。

问题很简单:

  • DataGrid(只读)绑定到一个对象集合(实现INotifyPropertyChanged)
  • 当数据对象的某些属性发生变化时,单元格背景应该设置动画(例如,从红色变为透明)

我尝试使用带有EventTrigger(TargetUpdated)的样式来启动Storyboard,但它有副作用,所有单元格的背景在首次填充DataGrid时以及滚动或重新排序时都会动画化。 / p>

我知道其他类似问题很少,但我没有看到有效的解决方案 有没有人能够做到这一点?我非常不希望有任何代码隐藏,但如果有必要,我会忍受它......

编辑:
我注意到对于我想要实现的目标存在一些困惑:
假设一个单元格(它是数据对象的底层属性)的值为“A”。在某些时候它变为“B”(例如从服务器更新)。此时背景应该“闪烁”(例如,从红色到透明的1秒动画)。在所有其他时间,背景应该是透明的。

2 个答案:

答案 0 :(得分:4)

我终于在MS论坛上指出了正确的方向,解决方案是使用附加行为来注册OnTargetUpdated处理程序并启动故事板。我之前尝试过这种方法,但显然只有当单元格的IsLoaded属性为真时才必须启动Storyboard。这消除了我上面提到的副作用。

以下是forum post的链接。

答案 1 :(得分:2)

添加如下所示的转换器:

namespace System.Converters
{
//Converter for cell animation 
  public  class flashConverter : IValueConverter
  {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string cellvalue = value.ToString();
        return cellvalue = ("place the condition here");
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return false;
    }
}

} 在MainWindow.xaml.cs中添加命名空间

   xmlns:loc="clr-namespace:YourProjectName.Converters"  

在您的资源中添加以下内容:

          <DataGrid.Resources>
          <loc:flashConverter x:Key="SomeConverter"></loc:flashConverter>
         </DataGrid.Resources>

在DatagridTextColumn中添加以下内容:

  <DataGridTextColumn Header="yourDatagridHeader"  IsReadOnly="True" Binding="{Binding Path=yourDatagridHeader}">
             <DataGridTextColumn.ElementStyle>
        <!--Style to implement the datagrid cell animation for yourDatagridcell-->
            <Style TargetType="{x:Type TextBlock}">
             <Style.Triggers>
             <DataTrigger Binding="{Binding yourDatagridHeader}" Value="Give your condition here">
            <!-#E6F85050 is the hexadecimal value for RED-->
             <Setter Property="Background" Value="#E6F85050"/>
             </DataTrigger>
             <DataTrigger Binding="{Binding yourDatagridHeader}" Value="Give your condition here">
             <Setter Property="Background" Value="give the hexadecimal value for transparent here "/>
              </DataTrigger>
           </Style.Triggers>
            </Style>
        </DataGridTextColumn.ElementStyle>
      </DataGridTextColumn>

希望这有帮助!