Wie kann ich eine WPF-Eventtrigger auf einem View-Trigger, wenn der zugrunde liegende Ansichtsmodell diktiert sie sollte?

StackOverflow https://stackoverflow.com/questions/1424202

  •  07-07-2019
  •  | 
  •  

Frage

Hier ist das Szenario:

Ich habe folgende Benutzersteuerung, die Idee ist, dass es View-Modell ist in der Lage sein soll, auf die Ansicht, um zu signalisieren, dass es braucht, um „die Glow zu aktivieren“, wodurch das Storyboard zu 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>

in dem Code-Behind für UnitView, ich habe:

public event EventHandler ActivateGlow;

und als ziemlich normal in MVVM ist, ich habe folgendes 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 so einrichten, dass das Viewmodel das OnActivateGlow Ereignis auslösen kann?

War es hilfreich?

Lösung

Update:. Firoso, wie sie in den Kommentaren erwähnt, sollten Sie in der Lage zu (ich glaube - das heißt nicht getestet) Lage sein, die Mischung Verhalten Komponenten zu verwenden, um Ihre Anforderung zu decken

Neben dem Download und der Installation des SDK. Holen Sie sich eine Kopie der Ausdruck Blendproben Bibliothek (Sie müssen auf Downloads auf dem folgenden Link klicken): Expression Blend Proben

Diese Bibliothek enthält eine vorkompilierte Trigger namens ‚DataEventTrigger‘, die Sie auf Ihrem Viewmodel erklärt auslösen Aktionen als Reaktion auf ein Ereignis verwenden können.

Die Mischung SDK hat bereits (von dem, was ich sagen kann), um das andere Stück des Puzzles - es enthält bereits eine Aktion, die Sie Storyboards steuern. Der Name dieser Aktion ist 'ControlStoryboardAction'.

Sie sollten mit etwas XAML am Ende, 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‘ mit dem Namen der Veranstaltung, die Sie auf Ihrem Viewmodel definiert haben, und ersetzen ‚Storyboard1‘ mit dem Namen Ihres Storyboard. Natürlich müssen die Namen exakt übereinstimmen.

Hier sind die XAML-Namespace-Definitionen verwendet:

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"

Original-Beitrag, vor edit:

Schlagen Sie Expression Blend Behaviors suchen in:

Informationen

SDK Ausblenden

Video auf Verhaltensweisen

Andere Tipps

Sie können auch ein boolean IsGlowing Eigentum auf Ihrem Ansichtsmodell setzen und verwenden datatriggers in Ihrem Stil

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

Ich glaube, Sie würden ein binden RoutedEvent Instanz, keine CLR-Ereignis.

Ich habe es nicht ausprobiert, aber so etwas wie dies funktionieren soll:

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

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

Ein Weg, fand ich dieses Problem zu beheben ist ein Datum Trigger für eine Datatemplate zu verwenden, die die obige Steuerung enthält ... wahrscheinlich nicht der beste Weg, dies jedoch zu tun. Ich bin zu einem besseren Idee noch offen.

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