graphics.hatenablog.com

技術系テクニカルアーティストのあれこれ

WPF/XAML で右クリックメニューへの DataContext の引き回し

DataGrid 上で右クリックしてウィンドウ開くときに、
そのウィンドウに DataGrid からデータ渡したかった。

<DataGrid
  ItemsSource="{Binding ItemList}"
  AutoGenerateColumns="False"
  SelectedItem="{Binding DataContext.CurrentItem, ElementName=RootWindow}"
  Tag="{Binding DataContext, ElementName=RootWindow}"
  Name="ItemGrid">

  <DataGrid.Columns>...</DataGrid.Columns>

  <DataGrid.ContextMenu>
    <ContextMenu
      DataContext="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}}">

      <MenuItem Header="編集">
        <i:Interaction.Triggers>
          <i:EventTrigger EventName="Click">
            <b:WindowTransitionAction
              DestinationWindow="{x:Type v:EditEnvWindow}"
              Mode="ShowDialog"
              DestinationWindowTag="{Binding CurrentItem}"
              OnClosedSourceWindowTarget="{Binding}"
              OnClosedSourceWindow="UpdateList"/>
          </i:EventTrigger>
        </i:Interaction.Triggers>
      </MenuItem>

    </ContextMenu>
  </DataGrid.ContextMenu>

</DataGrid>

どうやらポップアップ系は XAML で定義したビジュアルツリーから外れてるらしく、
WindowTransitionAction の中で AssociatedObject の Parent を辿ってたら
Popup のとこで Parent が null になってた。

しかたないから、ContextMenu の親が一旦 View の DataContext を抱えといて、
それを更に ContextMenu の DataContext を経由して Action に渡すことに。

なにこれめんどくさい。。