visual tutorial studio que español ejemplos wpf xaml binding mvvm icommand

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>