2014-02-23 38 views
4

我有下面的DataGrid單元格,我想在底層的LastTradePrice屬性更改其值時儘快對其背景顏色進行動畫處理。如何在更新的ViewModel屬性上數據觸發動畫?

<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

非常感謝

+0

Check [this](http://social.msdn.microsoft.com/Forums/en-US/cf65af63-07b2-47e3-a348-1fb8b4e09923/run-animation-each-time-an-inotifypropertychanged-property-更改?forum = wpf)鏈接。想法是它會在'Binding.TargetUpdated'事件上觸發動畫。我已經測試過它,它的工作原理,但它也觸發動畫初始值綁定。 – dkozl

+0

我喜歡這個解決方案。它使用'EventTrigger',並且ViewModel中不需要更改代碼。如果你喜歡,你可以擴展這個答案,或者我也可以做。 :) – Houman

+0

當然。我可以將我的例子作爲答案。 – dkozl

回答

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將被設置爲假,以節省提高2個附加事件時視圖和視圖模型之間被傳輸的值。

+1

感謝您的解釋。現在一切正常。 +1 – Houman

+0

沒問題。很高興幫助。 – dkozl

相關問題