2017-01-13 4 views
1

GroupBoxは親の中にGroupBoxです。どちらも私がインナーGroupBoxを押すと、それは、独自のCommandを発射して、親Commandもトリガされ、独自の内部グループボックスはインタラクティブ機能のイベントを受け付けません

<i:Interaction.Triggers> 
    <i:EventTrigger EventName="MouseLeftButtonDown"> 
    <i:InvokeCommandAction Command="{Binding ...}" /> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 

を持っています。

どうすればいいですか?どのように内部をGroupBoxイベントを飲み込ませるには?

<GroupBox Header="Outer" xmlns:mvvm="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Platform"> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="MouseLeftButtonDown"> 
      <i:InvokeCommandAction Command="{Binding OuterCommand}" /> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition /> 
      <RowDefinition /> 
     </Grid.RowDefinitions> 
     <TextBlock>...</TextBlock> 
     <GroupBox Header="Inner" Grid.Row="1"> 
      <i:Interaction.Triggers> 
       <i:EventTrigger EventName="MouseLeftButtonDown"> 
        <mvvm:EventToCommand Command="{Binding InnerCommand}" PassEventArgsToCommand="True" /> 
       </i:EventTrigger> 
      </i:Interaction.Triggers> 
      <TextBlock>inner...</TextBlock> 
     </GroupBox> 
    </Grid> 
</GroupBox> 

public class ViewModel 
{ 
    public ViewModel() 
    { 

     OuterCommand = new RelayCommand(arg => true, (arg)=> { MessageBox.Show("outer"); }); 
     InnerCommand = new RelayCommand(arg => true, 
      (arg) => 
      { 
       MessageBox.Show("inner"); 
       MouseButtonEventArgs mbea = arg as MouseButtonEventArgs; 
       if (mbea != null) 
        mbea.Handled = true; 
      }); 
    } 

    public RelayCommand OuterCommand { get; } 

    public RelayCommand InnerCommand { get; } 
} 

醜いを:

答えて

1

あなたはMvvmLight、ライブラリ内のEventToCommandクラスに、たとえば、コマンドにコマンドパラメータとしてイベント引数を渡すサポートTriggerActionの別の実装を使用することができますこの解決策をとっているのは、ビューモデルがビュー関連のMouseButtonEventArgsタイプに依存しているということです。

MVVM Passing EventArgs As Command Parameter

は、その後、あなたがに沿って、それを渡すのではなく、行動に直接MouseButtonEventArgsのHandledプロパティを設定することができます:あなたはこれを好きではない場合はこちらを@adabyronにより示唆されるように、あなたはあなた自身の動作を実装することができますビューモデル。

+0

これは解決策です! –

+0

myコマンドが既にこのようになっている場合、 'new RelayCommand (this.OnInnerCommand);'を返すと、 'MouseButtonEventArgs'もどうやって渡すのですか?また、 'CanExecute'を参照している場合は、' arg => true'を2番目の位置に置くことを意味すると思います。 –

+0

1つのコマンドだけを渡すことができるので、カスタムビヘイビアーを実装するか、内部GroupBoxのMouseLeftButtonDownイベントをビューのコードビハインドで処理してから、ビューモデルのコマンドを呼び出す必要があります。プロパティをtrueに処理します。 – mm8

関連する問題