wpf-当属性更改而与新值无关时触发datatrigger

问题描述

|| 当数据网格单元格的值更改时,我正在尝试对数据网格中的单元格执行动画。 数据网格本身绑定到普通旧CLR对象的ObservableCollection。在这种情况下,可以说这些对象是具有'Firstname \',\'Lastname \'和\'Age \'属性的\'Person \'对象。 \'Person \'类实现INotifyPropertyChanged接口,并且每个属性在其setter中都有对onPropertyChanged的适当调用。 一切都很好。在datagrid定义中,我设置了用于绘制每个单元格的DataTemplate,并且还附加了一个datatrigger ...如下所示:
<DataGridTemplateColumn Header=\"FirstName\">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <Border Name=\"templateBorder\">
                <TextBlock Name=\"templateTextBlock\" Text=\"{Binding Path=FirstName}\" />
            </Border>
            <DataTemplate.Triggers>
                <DataTrigger Binding=\"{Binding Path=FirstName}\" Value=\"Richard\">
                    <DataTrigger.Enteractions>
                        <BeginStoryboard>
                            <Storyboard AutoReverse=\"True\">
                                <DoubleAnimation Storyboard.TargetName=\"templateTextBlock\" Storyboard.TargetProperty=\"Opacity\" To=\".1\" Duration=\"0:0:.5\" />
                            </Storyboard>
                        </BeginStoryboard>
                    </DataTrigger.Enteractions>
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
当我的ObservableCollection中的对象被更新(我更改了FirstName值)时,数据网格也将被更新。按照上面的示例,如果我将FirstName的值更改为\'Richard \',那么动画也会执行得很好。 我的问题是,无论Firstname的新值是多少,我都需要运行动画。我已经爬网了,但似乎只有一些地方找不到针对已知值触发触发器的示例,例如如我在示例中所演示的,当FirstName为\'Richard \'时触发触发器。 我的问题是,无论更新属性的值如何,我如何触发数据触发器?因此,基本上,每当为数据网格中的给定行更新FirstName属性时,如何触发datatrigger。 非常感谢。     

解决方法

        由于从对该问题的回答中获得了指针,我发现答案是使用EventTrigger和TargetUpdated RoutedEvent。
<DataTemplate>
    <Border Name=\"templateBorder\">
        <TextBlock Name=\"templateTextBlock\" Text=\"{Binding Path=FirstName,NotifyOnTargetUpdated=True}\" />
    </Border>
    <DataTemplate.Triggers>
        <EventTrigger RoutedEvent=\"Binding.TargetUpdated\">
            <BeginStoryboard>
                <Storyboard AutoReverse=\"True\">
                    <DoubleAnimation Storyboard.TargetName=\"templateTextBlock\" Storyboard.TargetProperty=\"Opacity\" To=\".1\" Duration=\"0:0:.5\" />
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </DataTemplate.Triggers>
</DataTemplate>
除EventTrigger之外,唯一需要做的另一件事就是在设置文本块的绑定时设置\'NotifyOnTargetUpdated = True \'。 谢谢。     ,        看来您需要一个EventTrigger \“发生事件时执行X \”,而不是DataTrigger。 我自己没有尝试过..但是应该有可能引发您的自定义事件FirstNameChanged并执行触发操作来对此进行响应。     ,        
  <Storyboard x:Key=\"MessageStoryBoardEntry\" FillBehavior=\"Stop\">

            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty=\"(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)\">
                <EasingDoubleKeyFrame KeyTime=\"0:0:00.30\" Value=\"0\"/>
                <EasingDoubleKeyFrame KeyTime=\"0:0:03\" Value=\"0\"/>
                <EasingDoubleKeyFrame KeyTime=\"0:0:03.20\" Value=\"1500\"/>
            </DoubleAnimationUsingKeyFrames>
        </Storyboard>

        <Storyboard x:Key=\"MessageStoryBoardExit\" FillBehavior=\"Stop\">

            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty=\"(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)\">
                <EasingDoubleKeyFrame KeyTime=\"0:0:0.001\" Value=\"1500\"/>
            </DoubleAnimationUsingKeyFrames>
        </Storyboard>
    ,        您可以尝试将TextBlock的DataContext设置为FirstName属性,然后使用DataContextChanged事件。 或者,您可以使用PropertyChanged事件并过滤所需的属性。 无论哪种方式,我认为您都必须使用一个事件。     ,        您可以使用价值转换器破解某些东西吗?
<DataTrigger Binding=\"{Binding Path=FirstName,Converter=FirstNameConverter}\" Value=\"MakeItSo\">
class FirstNameConverter : IValueConverter
{
    public object Convert(object value,Type targetType,object parameter,CultureInfo culture)
    {
        return \"MakeItSo\";
    }

    public object ConvertBack(object value,CultureInfo culture)
    {
...
    }
}
我想这取决于WPF是否在每次属性更改时都调用转换器,还是首先评估该值。我没有尝试过,只是一个想法...