Frage

Dies ist eine Situation, die oft kommt:

In der Ansicht, haben Sie ein Steuerelement gebunden an ein Ansichtsmodell Eigenschaft (unterstützt durch eine INotifyPropertyChanged). Zum Beispiel:

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

Wenn die Eigenschaftsänderungen, müssen Sie den Benutzer auf die Tatsache aufmerksam mit einigen kreativen Animation bringen. Wie ich die Tatsache nutzen, dass der Blick bereits auf die Benachrichtigung verdrahtet ist und vermeiden Sie viel von dem zusätzlichen Code zu schaffen (oder zumindest schafft es einmal und Wiederverwendung). Daten-Trigger sind wahrscheinlich die beste Wahl, aber ich weiß nicht, wie sie auf einem beliebigen Wert Veränderung gegenüber auf einem spezifischen Wert Feuer zu machen.

Die folgenden Optionen in den Sinn kommen:

  • ein zusätzliches Ereignis im Ansichtsmodell erhöhen, abonnieren Sie im View-Code-behind.
  • erstellen Datatrigger auf die Eigenschaft gebunden genannten A-Wandler verwenden, die true zurück, wenn der Wert ändert.
  • erstellen Datatrigger zu einer neuen boolean-Eigenschaft auf dem Viewmodel gebunden, die auf „Signal“ die Änderung verwendet wird.
  • ein Verhalten erstellen, um die Steuerung angebracht, die an die Abhängigkeitseigenschaft Änderung der Kontrolle und starten Sie die Animation abonnieren würde.

Welches mögen Sie / verwenden? Habe ich vermisse alle Optionen?

P. S. Es wäre schön (aber nicht kritisch), wenn die Lösung eine Möglichkeit bieten würde die Animation ersten und spiegelt die Wertänderung zu starten, wenn es beendet wird.

War es hilfreich?

Lösung

Ok, das ist, was ich kam nach einigem Experimentieren.

Ich habe eine Expression Blend 3-Trigger mit einer Abhängigkeitseigenschaft erstellt (I nannte es Abonnement). Ich binde das Abonnement auf den gleichen Wert, dass mein Textblock und dieser Trigger gebunden ist, wird auf eine ControlStoryboardAction von Expression Blend 3 angebracht ist.

Hier ist der Auslöser:

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

Hier ist, wie es auf dem Storyboard angebracht ist:

<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>

Ich mag diesen Ansatz viel, gute Arbeit geleistet Blend 3 Designer!

Edit: beantworten Drew Kommentar ...

Ja, es wird mit Mischung. Sie können nur Microsoft.Expression.Interactions.dll und System.Windows.Interactivity in Ihr Projekt enthalten.

Und ja, es ist die ausführliche (ich gefragt, ob jemand einen guten Weg gefunden, Verhaltensweisen über Stile anwenden in dieser Frage ) - aber es ist auch ein Vorteil der Flexibilität. Zum Beispiel können Sie nicht nur ein Storyboard starten, sondern auch einen Zustand oder tun eine andere Aktion aus dem gleichen Trigger eingeschaltet werden.

Andere Tipps

Sie können einen Trigger erstellen, die die Animation starten wird.

So etwas wie folgt aus:

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

Wie für die Ausgabe für die Ausgabe des Wertes der Einstellung, wenn die Animation beendet hat, ist dies ein bisschen Schmerz. Soweit ich weiß Sie das ausgefüllte Veranstaltung auf dem Storyboard verwenden müssten, dies erfordert Code hinter, das etwas, was Sie wollen, ist mit MVVM zu vermeiden.

Ich habe versucht, mit Eventtriggers zu den abgeschlossenen Ereignissen zu binden, aber das bringt auch einige Komplikationen. Siehe hier für weitere Details.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top