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

如何解决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是否在每次属性更改时都调用转换器,还是首先评估该值。我没有尝试过,只是一个想法...     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?