【问题标题】:How to datatrigger an animation upon updated ViewModel property?如何在更新的 ViewModel 属性后触发动画?
【发布时间】:2014-03-25 03:00:31
【问题描述】:

我有以下 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) &lt;DataTrigger Binding="{Binding LastTradePrice}" Value="True"&gt; 这行没有意义。

LastTradePrice 属性显然不是用value = True 测量的布尔值。每当更新属性时,如何使触发器触发?显然我已经实现了 INotification:

        public double LastTradePrice
        {
            get { return _model.LastTradePrice; }
            set
            {
                if (value != _model.LastTradePrice)
                {
                    LastTradePrice = value;
                    OnPropertyChanged("LastTradePrice");
                }
            }
        }

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

非常感谢

【问题讨论】:

  • 检查this 链接。想法是它将在Binding.TargetUpdated 事件上触发动画。我已经对其进行了测试,它可以工作,但它也会触发初始值绑定的动画。
  • 我喜欢这个解决方案。它使用EventTrigger,并且不需要在 ViewModel 中更改代码。如果您愿意,可以将此扩展为答案,或者我也可以这样做。 :)
  • 当然。我可以把我的例子放到答案中。

标签: .net wpf mvvm datatrigger


【解决方案1】:

正如评论中提到的,您可以使用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 个额外事件。

【讨论】:

  • 没问题。很高兴它有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-09
  • 1970-01-01
  • 2020-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-24
相关资源
最近更新 更多