2009-07-13 19 views
6

這是經常出現的情況:限制值變化時啓動動畫的最佳方式是什麼?

在視圖中,你必須綁定到視圖模型屬性(由INotifyPropertyChanged的支持)的控制。例如:

<TextBlock Text="{Binding Path=Subtotal}"/> 

當屬性的變化,你需要把用戶注意一個事實,一些動漫創意。我如何利用視圖已經連接到通知並避免創建大量額外代碼(或者至少創建一次並重新使用)的事實。數據觸發器可能是最好的選擇,但我不知道如何讓它們觸發任何價值變化與某些特定價值。

下列選項浮現在腦海中:

  • 籌集視圖模型額外的事件,在查看訂閱代碼隱藏。
  • 創建一個綁定到使用轉換器提到的屬性的數據觸發器,如果​​值發生變化,將返回true。
  • 創建綁定到ViewModel上的新布爾屬性的datatrigger,該屬性用於「發信號」更改。
  • 創建附加到控件的行爲,該控件將訂閱控件的依賴項屬性更改並啓動動畫。

你喜歡/使用哪一個?我錯過任何選擇嗎?

P.S.如果解決方案能夠首先啓動動畫,並在結束時反映價值變化,那將會很好(但並非關鍵)。

回答

3

好吧,這是我經過一番嘗試後才發現的。

我已經創建了具有依賴項屬性的Expression Blend 3觸發器(我將其命名爲Subscription)。我認購綁定到我的TextBlock綁定到相同的值,這觸發附加到ControlStoryboardAction從Expression Blend中3

這裏的觸發:

public class DataTriggerPlus : TriggerBase<DependencyObject> 
{ 
    public static readonly DependencyProperty SubscriptionProperty = 
     DependencyProperty.Register("Subscription", 
      typeof(string), 
      typeof(DataTriggerPlus), 
      new FrameworkPropertyMetadata("", 
       new PropertyChangedCallback(OnSubscriptionChanged))); 

    public string Subscription 
    { 
     get { return (string)GetValue(SubscriptionProperty); } 
     set { SetValue(SubscriptionProperty, value); } 
    } 

    private static void OnSubscriptionChanged(DependencyObject d, 
     DependencyPropertyChangedEventArgs e) 
    { 
     ((DataTriggerPlus)d).InvokeActions(null); 
    } 
} 

下面是它是如何連接到故事板:

<TextBlock x:Name="textBlock" Text="{Binding TestProp}" Background="White"> 
    <i:Interaction.Triggers> 
     <local:DataTriggerPlus Subscription="{Binding TestProp}"> 
      <im:ControlStoryboardAction 
       Storyboard="{StaticResource Storyboard1}"/> 
     </local:DataTriggerPlus> 
    </i:Interaction.Triggers> 
</TextBlock> 

我喜歡這種方法很多,很棒的工作混合3名設計師!

編輯:回答Drew評論...

是的,它附帶Blend。您可以將Microsoft.Expression.Interactions.dll和System.Windows.Interactivity包含到您的項目中。

是的,它是冗長的(我問過是否有人通過樣式in this question找到了一種適用行爲的好方法) - 但也有靈活性的好處。例如,您不僅可以啓動故事板,還可以切換狀態或從同一觸發器執行其他操作。

2

您可以創建一個觸發器來啓動動畫。

事情是這樣的:

<Style> 
    <Style.Triggers> 
     <Trigger 
      Property="ViewModelProperty" 
      Value="True"> 
      <Trigger.EnterActions> 
       <BeginStoryboard Storyboard="YourStoryBoard" /> 
      </Trigger.EnterActions> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

至於這一次的動畫已經完成設定值問題的問題,這是一個有點疼痛。據我所知,您需要在故事板上使用完成的事件,這需要隱藏代碼,這是您想要通過MVVM避免的。

我試過使用EventTriggers綁定到已完成的事件,但這也引入了一些複雜性。有關更多詳細信息,請參見here

+0

同樣,如果屬性不是布爾值或一組選項,但是是一個任意的字符串或數字呢? – 2009-07-13 23:51:18

+0

然後你會使用一個ValueConverter。相同的解決方案,只需使用valueConverter – 2009-07-14 02:01:41

相關問題