tutorial - wpf vs windows forms
Pasa el parámetro del comando desde el xaml (2)
Intenta algo como esto en tu CommandParameter,
<DataGrid.ContextMenu>
<ContextMenu>
<MenuItem Header="MyHeader"
Command="{Binding MyCommand}"
CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}, Path=PlacementTarget.SelectedItem}" />
</DataGrid.ContextMenu>
Ya lo he probado y debería funcionar.
Intento hacer algo como esto:
<DataGrid Name="myGrid" ItemSource="{Binding Path=MyCollection}">
<DataGrid.ContextMenu>
<ContextMenu>
<MenuItem
Command="{Binding RemoveRow}"
CommandParameter="{Binding ElementName=myGrid, Path=SelectedItem}">
</ContextMenu>
</DataGridContextMenu>
</DataGrid>
pero siempre obtuve el valor nulo (también probé SelectedIndex y SelectedValue)
Si paso el siguiente parámetro al código de ejecución, funciona:
<MenuItem Command="{Binding RemoveRow}" CommandParameter="1">
No funciona porque ContextMenu
no forma parte del árbol visual o lógico de DataGrid
, por lo que no hereda el DataContext
.
Por lo que sé, hay una solución fácil para este problema utilizando solo el sistema de enlace incorporado. Sin embargo, utilizando una clase de "proxy" simple como se explica here , puede solucionar este problema:
<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>
Sin embargo, todavía tiene un problema: ElementName=myGrid
no funciona (de nuevo, porque ContextMenu
no está en el árbol visual o lógico de DataGrid
, por lo que no está en el mismo ámbito de nombre). Una solución simple es vincular el SelectedItem
del DataGrid
a una propiedad del ViewModel, y usar esa propiedad en lugar del parámetro de comando:
<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>