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

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

  •  07-07-2019
  •  | 
  •  

質問

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

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

<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イベントを起動できるように何かを設定するにはどうすればよいですか?

役に立ちましたか?

解決

更新:Firoso、コメントで述べたように、ブレンド動作コンポーネントを使用して要件を満たすことができる(つまりテストされていない)と思うはずです。

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

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

ブレンドSDKには、パズルのもう1つのピースが既にあります(私が知る限り)-ストーリーボードを制御できるアクションが既に含まれています。このアクションの名前は「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"

編集前の元の投稿:

Expression Blendの動作を確認することをお勧めします:

情報

ブレンドSDK

ビヘイビアに関するビデオ

他のヒント

ビューモデルにブール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>  

RoutedEvent インスタンス。CLRイベントではありません。

試したことはありませんが、次のように機能します:

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top