はContextMenu
のビジュアル ツリーまたは論理ツリーの一部ではDataGrid
なく、 を継承しないため、機能しませんDataContext
。
私の知る限り、組み込みのバインディング システムのみを使用して、この問題を簡単に解決することができます。ただし、ここで説明されているように単純な「プロキシ」クラスを使用すると、この問題を回避できます。
<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
ないため、同じ名前のスコープにはありません)。簡単な解決策は、 の を ViewModel のプロパティにバインドしSelectedItem
、DataGrid
コマンド パラメータの代わりにそのプロパティを使用することです。
<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>