当属性值保持不变时,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"属性的值没有改变,那么动画就不会被触发。有没有一种方法,我可以触发动画,不管值是否改变。
谢谢。
我的猜测是,当值不改变时,您实际上并没有在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事件,然后无论值是否改变都将触发动画。