4

DataTemplate内にカスタム動作があり、カスタムのルーテッドイベントが発生します。そのイベントをTriggerActionで処理したい(メッセージの送信、コマンドの呼び出しなど)。

<Border Background="#01FFFFFF" VerticalAlignment="Center">
             <i:Interaction.Behaviors>
                   <Behaviors:MyBehavior>
                        <i:Interaction.Triggers>
                             <i:EventTrigger EventName="MyEvent">
                                    <triggers:SendMessageAction Parameter="ActionTaskAssign" MessageToken="ActionTask" />
                             </i:CustomEventTrigger>
                        </i:Interaction.Triggers>
                    </Behaviors:DropBehavior>
              </i:Interaction.Behaviors>
<!-- .... -->

それでもはっきりとわかりますが、EventTriggerはビヘイビアーのMyEventをサブスクライブしていません。

  • バインディングからSourceObjectを設定しようとしましたが(ここを参照)、ElementNameバインディングが機能していないようで、FindAncestorも機能していません。
  • EventTriggerから継承し、コードでSourceObjectを設定しようとしましたが、取得したのはStackOverflowExceptionだけでした
  • カスタムEventTriggerを作成しようとしましたが、カスタムイベントごとに1つ作成するか(すべての地獄が崩壊した場合はそうします)、非一般的なイベントを処理する一般的な方法を理解する必要がありRoutedEventHandlerます...

私は何をすべきか?

4

1 に答える 1

1

問題は、EventTrigger が Behavior のイベントに接続されていないことです。代わりに、Behavior の AssociatedObject のイベントに接続しています。関連するソースコードは次のとおりです。

protected override void OnAttached()
{
    base.OnAttached();
    DependencyObject associatedObject = base.AssociatedObject;
    Behavior behavior = associatedObject as Behavior;
    FrameworkElement element = associatedObject as FrameworkElement;
    this.RegisterSourceChanged();
    if (behavior != null)
    {
        associatedObject = ((IAttachedObject) behavior).AssociatedObject;
        behavior.AssociatedObjectChanged += new EventHandler(this.OnBehaviorHostChanged);
    }
    ....

}

関連する質問がここで尋ねられました: VM で void Foo() を使用して MouseDragElementBehavior.Dragging イベントを処理する

コマンドを起動する独自のカスタム動作を作成することで、これを自分で解決しました(メッセージではなく必要でした.

ここの回答で私のアプローチを見ることができます:

コマンドによるカスタム動作

于 2012-10-09T05:14:13.677 に答える