当属性值保持不变时,WPF动画不会被触发

本文关键字:动画 WPF 属性 | 更新日期: 2023-09-27 18:03:13

我遵循了这个问题中描述的方法:当绑定值发生变化时,突出显示WPF DataGrid中的单元格

<Style x:Key="ChangedCellStyle" TargetType="DataGridCell">
    <Style.Triggers>
        <EventTrigger RoutedEvent="Binding.TargetUpdated">
            <BeginStoryboard>
                <Storyboard>
                    <ColorAnimation Duration="00:00:15"
                        Storyboard.TargetProperty=
                            "(DataGridCell.Background).(SolidColorBrush.Color)" 
                        From="Yellow" To="Transparent" />
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Style.Triggers>
</Style>
<DataGridTextColumn Header="Status" 
    Binding="{Binding Path=Status, NotifyOnTargetUpdated=True}" 
    CellStyle="{StaticResource ChangedCellStyle}" />

我面临的问题是,当底层属性值没有改变时,动画不会被触发。在上面的例子中,如果"Status"属性的值没有改变,那么动画就不会被触发。有没有一种方法,我可以触发动画,不管值是否改变。

谢谢。

当属性值保持不变时,WPF动画不会被触发

我的猜测是,当值不改变时,您实际上并没有在VM中为属性更改值。在MVVM中,当不需要时不引发property-changed是很常见的行为,但是在您的情况下,无论值是否改变,您都希望引发property-changed事件。

所以如果你有这样的东西:

public string Status {
  get { return _status; }
  set {
    if (_status == value)
    {
      return;
    }
    _status = value;
    RaisePropertyChanged(() => Status);
  }
}

改为:

public string Status {
  get { return _status; }
  set {
    //if (_status == value)
    //{
    //  return;
    //}
    _status = value;
    // Following line is the key bit. When this(property-changed event) is raised, your animation should start.
    // So whenever you need your animation to run, you need this line to execute either via this property's setter or elsewhere by directly raising it
    RaisePropertyChanged(() => Status);
  }
}

这将在每次调用属性的setter时触发property changed事件,然后无论值是否改变都将触发动画。