21

私はこのようなことをしようとします:

<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">
4

2 に答える 2

18

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 のプロパティにバインドしSelectedItemDataGridコマンド パラメータの代わりにそのプロパティを使用することです。

<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>
于 2011-11-16T16:20:59.540 に答える