私はこのようなことをやろうとします:
<DataGrid Name="myGrid" ItemSource="{Binding Path=MyCollection}">
<DataGrid.ContextMenu>
<ContextMenu>
<MenuItem
Command="{Binding RemoveRow}"
CommandParameter="{Binding ElementName=myGrid, Path=SelectedItem}">
</ContextMenu>
</DataGridContextMenu>
</DataGrid>
しかし、常にnullを取得しました(SelectedIndexとSelectedValueも試しました)
次のパラメーターを実行コードに渡すと、機能します。
<MenuItem Command="{Binding RemoveRow}" CommandParameter="1">
CommandParameterでこのようなものを試してください、
<DataGrid.ContextMenu>
<ContextMenu>
<MenuItem Header="MyHeader"
Command="{Binding MyCommand}"
CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}, Path=PlacementTarget.SelectedItem}" />
</DataGrid.ContextMenu>
私はすでにそれをテストしました、そしてそれはうまくいくはずです。
ContextMenu
はDataGrid
の視覚的または論理的なツリーの一部ではないので機能せず、DataContext
を継承しません。
私の知る限り、組み込みのバインディングシステムのみを使用してこの問題を簡単に解決する方法があります。ただし、説明されているように単純な「プロキシ」クラス here を使用すると、この問題を回避できます。
<DataGrid Name="myGrid" ItemSource="{Binding Path=MyCollection}">
<DataGrid.Resources>
<local:BindingProxy x:Key="proxy" Data="{Binding}" />
</DataGrid.Resources>
<DataGrid.ContextMenu>
<ContextMenu>
<MenuItem
Command="{Binding Data.RemoveRow, Source={StaticResource proxy}}"
CommandParameter="{Binding ElementName=myGrid, Path=SelectedItem}">
</ContextMenu>
</DataGridContextMenu>
</DataGrid>
ただし、まだ問題があります:ElementName=myGrid
は機能しません(ここでも、ContextMenu
はDataGrid
のビジュアルツリーまたは論理ツリーにないため、同じ名前のスコープにはありません)。簡単な解決策は、SelectedItem
のDataGrid
をViewModelのプロパティにバインドし、コマンドパラメータの代わりにそのプロパティを使用することです。
<DataGrid Name="myGrid" ItemSource="{Binding Path=MyCollection}"
SelectedItem="{Binding SelectedItem}">
<DataGrid.Resources>
<local:BindingProxy x:Key="proxy" Data="{Binding}" />
</DataGrid.Resources>
<DataGrid.ContextMenu>
<ContextMenu>
<MenuItem
Command="{Binding Data.RemoveRow, Source={StaticResource proxy}}">
</ContextMenu>
</DataGridContextMenu>
</DataGrid>