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

2024-01-30

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

非常感谢


正如评论中提到的,您可以利用Binding.TargetUpdated http://msdn.microsoft.com/en-us/library/system.windows.data.binding.targetupdated%28v=vs.110%29.aspx event.

当值从绑定源传输到绑定目标时发生,但仅适用于 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 个附加事件的情况。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在更新 ViewModel 属性时数据触发动画? 的相关文章

随机推荐