web-dev-qa-db-ja.com

基になるViewmodelで指示されたときに、ViewトリガーでWPF EventTriggerを使用するにはどうすればよいですか?

シナリオは次のとおりです。

私は次のユーザーコントロールを持っています。ビューモデルは、「グローをアクティブ化」する必要があることをビューに通知して、ストーリーボードを再生できるようにする必要があるという考えです。

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

unitViewのコードビハインドには、次のものがあります。

public event EventHandler ActivateGlow;

mVVMではごく普通のことですが、UnitViewModelには次のDataTemplateがあります。

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

究極の質問は、ビューモデルがOnActivateGlowイベントを起動できるように何かを設定するにはどうすればよいですか?

24
Firoso

更新:Firoso、コメントで述べたように、要件をカバーするためにブレンド動作コンポーネントを使用できるはずです(私は思う-つまりテストされていません)。

SDKのダウンロードとインストールに加えて。 Expression Blendサンプルライブラリのコピーを入手します(次のリンクからダウンロードをクリックする必要があります): Expression Blendサンプル

このライブラリには、ビューモデルで宣言されたイベントに応答してアクションをトリガーするために使用できる「DataEventTrigger」と呼ばれるビルド済みのトリガーが含まれています。

ブレンドSDKには、(私が知る限り)パズルの他の部分がすでに含まれています。ストーリーボードを制御できるアクションがすでに含まれています。このアクションの名前は「ControlStoryboardAction」です。

最終的に次のようなxamlが作成されるはずです。

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

「YourEvent」をビューモデルで定義したイベントの名前に置き換え、「Storyboard1」をストーリーボードの名前に置き換えます。もちろん、名前は完全に一致する必要があります。

使用されるxaml名前空間の定義は次のとおりです。

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"

編集前の元の投稿:

ExpressionBlendの動作を調べることをお勧めします。

情報

ブレンドSDK

行動に関するビデオ

11
Phil

ビューモデルにブールIsGlowingプロパティを配置し、スタイルでデータトリガーを使用することもできます。

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

これを解決するために私が見つけた1つの方法は、上記のコントロールを含むDataTemplateでデータトリガーを使用することです...しかし、おそらくこれを行うための最良の方法ではありません。私はまだより良いアイデアを受け入れています。

0
Firoso

CLRイベントではなく、 RoutedEvent インスタンスにバインドする必要があると思います。

私はそれを試していませんが、次のようなものが機能するはずです:

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

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