web-dev-qa-db-ja.com

XAMLからコマンドパラメータを渡す

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

<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">
21
Maya

CommandParameterでこのようなものを試してください、

<DataGrid.ContextMenu>
     <ContextMenu>
           <MenuItem Header="MyHeader" 
                     Command="{Binding MyCommand}"
                     CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}, Path=PlacementTarget.SelectedItem}" />
</DataGrid.ContextMenu>

私はすでにそれをテストしました、そしてそれはうまくいくはずです。

22
Rayan Elmakki

ContextMenuDataGridの視覚的または論理的なツリーの一部ではないので機能せず、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は機能しません(ここでも、ContextMenuDataGridのビジュアルツリーまたは論理ツリーにないため、同じ名前のスコープにはありません)。簡単な解決策は、SelectedItemDataGridを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>
18
Thomas Levesque