如何在更新的ViewModel属性上触发动画数据?

Hou*_*man 4 .net wpf datatrigger mvvm

我有以下DataGrid单元格,一旦底层LastTradePrice属性更改其值,我想简要地为其背景颜色设置动画.

<DataGridTextColumn Header="Last Trade Price" Binding="{Binding LastTradePrice}">
     <DataGridTextColumn.CellStyle>
          <Style TargetType="DataGridCell">
             <Style.Triggers>
                // ???
                <DataTrigger Binding="{Binding LastTradePrice}" Value="True"> 
                     <DataTrigger.EnterActions>
                          <BeginStoryboard>
                              <Storyboard>
                                 <ColorAnimation To="Aqua" Duration="0:0:0.3" Storyboard.TargetProperty="Background.(SolidColorBrush.Color)"/>
                              </Storyboard>
                          </BeginStoryboard>
                      </DataTrigger.EnterActions>
                 </DataTrigger>
             </Style.Triggers>
          </Style>
    </DataGridTextColumn.CellStyle>
</DataGridTextColumn>
Run Code Online (Sandbox Code Playgroud)

1)这条线<DataTrigger Binding="{Binding LastTradePrice}" Value="True">没有意义.

该属性LastTradePrice显然不是一个可以测量的布尔值value = True.如何在更新属性时触发触发器?显然我已经实现了INotification:

        public double LastTradePrice
        {
            get { return _model.LastTradePrice; }
            set
            {
                if (value != _model.LastTradePrice)
                {
                    LastTradePrice = value;
                    OnPropertyChanged("LastTradePrice");
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

2)如果我将整个样式定义存储在里面<Window.Resources>,我将如何访问ViewModels属性LastTradePrice

非常感谢

dko*_*ozl 8

如评论中所述,您可以利用Binding.TargetUpdated事件.

在将值从绑定源传输到绑定目标时发生,但仅在将NotifyOnTargetUpdated值设置为true的绑定时发生.

这意味着如果将值从视图模型拉入视图,并且NotifyOnTargetUpdated == True反对绑定,TargetUpdated则会引发事件.因此,在最初显示值时或稍后INotifyPropertyChanged.PropertyChanged在视图模型中引发事件时将引发它.

<DataGridTextColumn Header="Last Trade Price" Binding="{Binding Path=LastTradePrice, NotifyOnTargetUpdated=True}">
   <DataGridTextColumn.CellStyle>
      <Style TargetType="DataGridCell">
         <Style.Triggers>
            <EventTrigger RoutedEvent="Binding.TargetUpdated">
               <BeginStoryboard>
                  <Storyboard>
                     <ColorAnimation To="Aqua" Duration="0:0:0.3" AutoReverse="True" Storyboard.TargetProperty="Background.(SolidColorBrush.Color)" />
                  </Storyboard>
               </BeginStoryboard>
            </EventTrigger>
         </Style.Triggers>
      </Style>
   </DataGridTextColumn.CellStyle>
</DataGridTextColumn>
Run Code Online (Sandbox Code Playgroud)

此外,如果想简单地通知换色要设置AutoReverse="True"ColorAnimation否则Aqua颜色会留下来.此解决方案的唯一缺点是,它将在DataGrid创建和加载初始值时触发.

还有一个Binding.SourceUpdated事件与NotifyOnSourceUpdated反对绑定有关,并且在与TargetUpdated事件相反的方向上工作.当新值从视图传输到视图模型时,将触发它.

获取或设置一个值,该值指示当值从绑定目标传输到绑定源时是否引发SourceUpdated事件.

默认情况下,当视图和视图模型之间传输值时,NotifyOnTargetUpdatedabd NotifyOnSourceUpdated将设置为false以节省引发2个附加事件.