0

ビューモデルにあるコマンドにバインドしようとしています。ビジュアルツリーのずっと下にあるイベントトリガーを使用しています。私はそれにバインドしようとして、RelativeSource、FindAncestor、AncestorTypeの多くのバリエーションを試しました。バインドパス式エラーが発生するたびに。

これは私のxamlドキュメントの概要です:

<Window>
   <Grid>
      <GridView>
         <HierarchyChildTemplate>
             <DataTemplate>
                  <TabControl>
                      <TabItem>
                          <GridView>
                              <RowDetailsTemplate>
                                 <TabControl>
                                     <!--trying to bind a event trigger here to a command on the viewModel -->

これが私が試したバインディングの例です:

<i:Interaction.Triggers>
      <i:EventTrigger EventName="SelectionChanged">
          <i:InvokeCommandAction Command="{Binding Path=SelectionChangedCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Grid}}}"/>
      </i:EventTrigger>
</i:Interaction.Triggers>

xamlに記載されている場所からこのコマンドにバインドするにはどうすればよいですか?

4

2 に答える 2

0

あなたのビジュアルツリーとあなたがコメントに書いたことに基づいて(私はそれをテストしていません):

<i:Interaction.Triggers>
  <i:EventTrigger EventName="SelectionChanged">
      <i:InvokeCommandAction Command="{Binding Path=DataContext.SelectionChangedCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Window}}}"/>
  </i:EventTrigger>
</i:Interaction.Triggers>

そうは言っても、この場合は名前付きバインディングを使用することをお勧めします。一番上のグリッド(または元のウィンドウ)に名前を付けます。例:

<Window Name="MainWindow">
  ....

ElementName次に、 :を使用してバインドできます。

<i:InvokeCommandAction Command="{Binding Path=DataContext.SelectionChangedCommand, 
                                         ElementName=MainWindow}"/>

コメントで言ったこと(AncestorTypeが間違ったグリッドに到達している)に関しては、を使用AncestorLevel=2すると最上位のグリッドにバインドするのに役立ちます。

于 2013-01-21T20:26:32.090 に答える
0

これを試してみて、うまくいきました:

<i:Interaction.Triggers>
  <i:EventTrigger EventName="SelectionChanged">
     <i:InvokeCommandAction Command="{Binding Path=DataContext.SelectionChangedCommand, 
         RelativeSource={RelativeSource Mode=FindAncestor, AncestorLevel=2,AncestorType={x:Type GridView}}}"/>
   </i:EventTrigger>
</i:Interaction.Triggers>     

ここでの重要なポイントは、コマンドの前にDataContextとAncestorLevel=2を付けることです。

于 2013-01-21T21:00:11.943 に答える