0

アプリケーションに2つのネストされたグリッド(FrameworkElement)アイテムがあります。

<UserControl xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity">        
<Grid x:name="OuterGrid">
          <i:Interaction.Triggers>
          <i:EventTrigger EventName="MouseLeftButtonDown">
           <i:InvokeCommandAction x:Name="TheOuterCommand" Command="{Binding OuterCommand}"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
            <Grid x:name="InnerGrid">
             <i:Interaction.Triggers>
                <i:EventTrigger EventName="MouseLeftButtonDown">
                    <i:InvokeCommandAction x:Name="TheInnerCommand" Command="{Binding InnerCommand}"/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
        </Grid>
    </Grid>
</UserControl>

各InvokeCommandsは、ビューモデルの(Prismライブラリからの)DelegateCommandにアタッチされます。

OuterCommand = new DelegateCommand(OuterCommandMethod, e => true);
InnerCommand = new DelegateCommand(InnerCommandMethod, e => true);

現時点では、 MouseLeftButtonEventがInnerGridレベルで処理されていないため、 InnerGridのEventTriggerもOuterGridのイベントをトリガーします。

EventTriggerに処理され、OuterGridにバブルアップしないように通知する方法はありますか?

現時点では、XAMLコードビハインドでイベントを使用してイベントを処理するように設定するInnerGridのラッパーFrameworkElementを使用することしか考えられません。他に何かアイデアはありますか?

----編集---- 最後に、アプリケーションにMVVM Lightを含め、InvokeCommandActionをRelayCommandに置き換えました。これは現在、意図したとおりに機能しています。ブライアントの答えを、私に提案をしてくれた勝者としてマークします。

4

2 に答える 2

3

EventTriggerと呼ばれる依存関係プロパティを追加して拡張しIsInner、常に内部に静的フラグを設定しましたEventTrigger。アウターEventTriggerはフラグの設定を解除し、フラグが設定されている場合は戻ります。それは書くのが非常に簡単で、うまく機能します。

于 2012-11-28T17:09:11.050 に答える
0

最善の策は、イベント引数をコマンドに渡してから、イベント引数を使用して処理されたイベントにマークを付けることです。ここでこの例に従うことにより、これを行うことができます。

于 2011-09-22T00:19:51.143 に答える