wpf - Comando de enlace de DataGrid a selección de fila
select data-binding (1)
Quiero ejecutar un comando cuando el usuario selecciona una fila en un DataGrid.
Veo que es posible envolver el contenido de la celda en botones (aunque no quiero el estilo del botón), pero no quiero hacerlo a nivel de celda.
También veo que es posible usar comportamientos para vincular un comando a un evento. Pero preferiblemente no debería tener que recurrir a comportamientos para una tarea tan común.
¿Es posible hacer esto a través del antiguo enlace de datos de comandos?
Por lo tanto: 1) el usuario hace clic en el comando Fila de DataGrid 2) en el modelo de vista se activa.
Gracias por adelantado.
Debe utilizar el ensamblaje "Interactividad" y el evento SelectionChanged
.
<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding People}">
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Binding="{Binding ID}" />
<DataGridTextColumn Header="Name" Binding="{Binding Name}" />
</DataGrid.Columns>
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="{Binding MyCommand}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</DataGrid>
Donde "i" es espacio de nombres:
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
También puede escribir el enlace a la propiedad SelectedItem
de DataGrid y en el set accessor puede invocar su comando, pero la primera solución que le presenté anteriormente es mejor.
Si desea invocar comandos desde el modelo de vista principal y pasar SelectedItem
de DataGrid
, puede usar CommadParameter
:
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="{Binding MyCommand}"
CommandParameter="{Binding Path=SelectedItem, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}" />
</i:EventTrigger>
</i:Interaction.Triggers>
Cuando los elementos tienen comando propio, puedes usar el siguiente código:
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="{Binding Path=SelectedItem.MyCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}" />
</i:EventTrigger>
</i:Interaction.Triggers>
O si los elementos tienen un modelo de vista propio que se asigna a su DataContext
, puede usar el siguiente código:
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="{Binding Path=SelectedItem.DataContext.MyCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=DataGrid}}" />
</i:EventTrigger>
</i:Interaction.Triggers>