首页>Program>source

当数据网格单元格的值更改时,我正在尝试对数据网格中的单元格执行动画。

数据网格本身绑定到普通旧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属性时,如何触发数据触发。

非常感谢。

最新回答
  • 2天前
    1 #

    感谢从对此问题的答复中获得的指针,我发现答案是使用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"。

    谢谢。

  • 2天前
    2 #

    似乎您需要一个EventTrigger"在事件发生时执行X操作",而不是DataTrigger。

    我自己还没有尝试过..但是应该可以引发自定义事件FirstNameChanged并执行触发操作来对此进行响应。

  • 2天前
    3 #

     <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>
    

  • 2天前
    4 #

    您可以尝试将TextBlock的DataContext设置为FirstName属性,然后使用DataContextChanged事件。

    或者您可以使用PropertyChanged事件并过滤所需的属性。

    无论哪种方式,我都认为您将不得不使用一个事件。

  • 2天前
    5 #

    您能用值转换器破解某些东西吗?

    <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, Type targetType, object parameter, CultureInfo culture)
        {
    ...
        }
    }
    

    我猜这取决于wPF是否在每次属性更改时都调用转换器,还是首先评估该值.我没有尝试过,只是一个想法...

  • java:在什么情况下,空的同步块可以实现正确的线程语义?
  • python:conda命令将提示错误:"错误的解释器:没有这样的文件或目录"