基になるViewmodelが指示するときに、ViewトリガーでWPF EventTriggerを使用するにはどうすればよいですか?
-
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の動作を確認することをお勧めします:
他のヒント
ビューモデルにブール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でデータトリガーを使用することです。ただし、おそらくこれを行う最適な方法ではありません。私はまだより良いアイデアを受け入れています。