28 Stimmen

Wie kann ich ein WPF EventTrigger auf eine Ansicht auslösen, wenn das zugrunde liegende Viewmodel diktiert es sollte?

Das Szenario sieht folgendermaßen aus:

Ich habe die folgende Benutzer-Steuerelement, die Idee ist, dass es Ansicht Modell sollte in der Lage sein, die Ansicht zu signalisieren, dass es braucht, um "Aktivieren Sie die Glow", wodurch das Storyboard spielen.

<UserControl x:Class="View.UnitView"  ... >
   ...
    <Storyboard x:Key="ActivateGlow">
       ...
    </Storyboard>
    ...
    <!-- INVALID BINDING! Not Dependancy Object-->
    <EventTrigger RoutedEvent="{Binding OnActivateGlow}"> 
       <BeginStoryboard Storyboard="{StaticResource ActivateGlow}"/>
    </EventTrigger>
</UserControl>

im Codebehind für UnitView habe ich:

public event EventHandler ActivateGlow;

und wie ist ziemlich normal in MVVM, ich habe die folgende DataTemplate für UnitViewModel:

<DataTemplate DataType="{x:Type vm:UnitViewModel}">
    <vw:UnitView d:DesignWidth="150" d:DesignHeight="100" />
</DataTemplate>

Die ulitmate Frage ist, wie kann ich etwas einrichten, so dass das Viewmodel das OnActivateGlow-Ereignis auslösen kann?

13voto

Phil Punkte 2645

Aktualisierung: Firoso, wie in den Kommentaren erwähnt, sollten Sie in der Lage sein (ich denke - d.h. ungetestet), die Blend-Verhaltenskomponenten zu verwenden, um Ihre Anforderungen zu erfüllen.

Zusätzlich zum Herunterladen und Installieren des SDK. Holen Sie sich eine Kopie der Expression-Blend-Beispielbibliothek (klicken Sie unter dem folgenden Link auf Downloads): Expression Blend Proben

Diese Bibliothek enthält einen vorgefertigten Trigger namens "DataEventTrigger", den Sie verwenden können, um Aktionen als Reaktion auf ein im Viewmodel deklariertes Ereignis auszulösen.

Das Blend-SDK enthält (soweit ich das beurteilen kann) bereits das andere Teil des Puzzles - es enthält bereits eine Aktion, mit der Sie Storyboards steuern können. Der Name dieser Aktion ist "ControlStoryboardAction".

Am Ende sollten Sie eine xaml-Datei haben, die wie folgt aussieht:

    <i:Interaction.Triggers>
        <samples:DataEventTrigger EventName="YourEvent">
            <im:ControlStoryboardAction Storyboard="{StaticResource Storyboard1}" 
                   ControlStoryboardOption="Play"/>
        </samples:DataEventTrigger>
    </i:Interaction.Triggers>

Ersetzen Sie "YourEvent" durch den Namen des Ereignisses, das Sie in Ihrem Viewmodel definiert haben, und ersetzen Sie "Storyboard1" durch den Namen Ihres Storyboards. Natürlich müssen die Namen genau übereinstimmen.

Hier sind die verwendeten xaml-Namespace-Definitionen:

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
xmlns:im="clr-namespace:Microsoft.Expression.Interactivity.Media;assembly=Microsoft.Expression.Interactions"
xmlns:samples="clr-namespace:Expression.Samples.Interactivity;assembly=Expression.Samples.Interactivity"

Ursprünglicher Beitrag, vor der Bearbeitung:

Schlagen Sie vor, dass Sie sich mit Expression Blend Behaviors befassen:

Informationen

Blend SDK

Video über Verhaltensweisen

7voto

kenwarner Punkte 27859

Sie können auch eine boolesche IsGlowing-Eigenschaft auf Ihr Viewmodel setzen und Datatrigger in Ihrem Stil verwenden

<Rectangle.Style>  
    <Style TargetType="{x:Type Rectangle}">  
        <Style.Triggers>  
            <DataTrigger Binding="{Binding Path=IsGlowing}" Value="True">  
                <DataTrigger.EnterActions>  
                    <BeginStoryboard>  
                        <Storyboard>  
                            ...  
                        </Storyboard>  
                    </BeginStoryboard>  
                </DataTrigger.EnterActions>  
            </DataTrigger>  
        </Style.Triggers>  
    </Style>  
</Rectangle.Style>

0voto

Drew Noakes Punkte 282438

Ich glaube, Sie müssten sich an eine RoutedEvent Instanz, nicht ein CLR-Ereignis.

Ich habe es nicht ausprobiert, aber so etwas sollte funktionieren:

public class UnitView
{
    public static readonly RoutedEvent ActivateGlowEvent
        = EventManager.RegisterRoutedEvent(
              "ActivateGlow", RoutingStrategy.Bubble,
              typeof(RoutedEventHandler), typeof(UnitView)
          );

    public void RaiseActivateGlowEvent()
    {
        RaiseEvent(new RoutedEventArgs(ActivateGlowEvent));
    }
}

0voto

Firoso Punkte 6467

Eine Möglichkeit, die ich gefunden habe, um dies zu beheben ist ein Daten-Trigger auf ein DataTemplate zu verwenden, die das oben genannte Steuerelement enthält... wahrscheinlich nicht der beste Weg, dies jedoch zu tun. Ich bin immer noch offen für bessere Ideen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X