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

时间:2014-02-23 16:30:18

标签: .net wpf mvvm datatrigger

我有以下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>

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");
                }
            }
        }

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

非常感谢

1 个答案:

答案 0 :(得分: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>

此外,如果想要通过颜色更改暂时通知,您希望将AutoReverse="True"设置为ColorAnimation,否则Aqua颜色将保留。此解决方案的唯一缺点是在创建DataGrid并加载初始值时也会触发。

还有Binding.SourceUpdated事件与NotifyOnSourceUpdated一起使用以防止绑定,并且与TargetUpdated事件的方向相反。当新值从视图传输到视图模型时,将触发它。

  

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

默认情况下,NotifyOnTargetUpdated abd NotifyOnSourceUpdated都将设置为false,以便在视图和视图模型之间传输值时节省2个额外事件。