wpf - Cómo enlazar un comando para hacer doble clic en una fila en DataGrid
icommand (2)
Desarrollé un UserControl de WPF que se debe usar como una lista de selección de la siguiente manera:
- Un DataGrid vinculado a un CollectionView de entidades (por ejemplo, de Empleados)
- Un cuadro de texto sobre DataGrid que se puede usar para filtrar elementos que se muestran en DataGrid.
Quiero exponer un comando que se ejecutará cuando el usuario haga doble clic en una fila en DataGrid. El contenedor puede reaccionar ante esto haciendo algo con el SelectedItem en DataGrid.
Hasta ahora he intentado manejar el doble clic de la siguiente manera:
<DataGrid IsReadOnly="True">
<DataGrid.InputBindings>
<MouseBinding MouseAction="LeftDoubleClick" Command="... />
</DataGrid.InputBindings>
...
Sin embargo, el evento de doble clic aún se activa cuando el usuario hace clic en el encabezado DataGrid. Me gustaría poder limitarlo para que el comando solo se ejecute cuando el doble clic está en el cuerpo del DataGrid. ¿Hay alguna manera declarativa de hacer esto?
ACTUALIZAR
Estoy empezando a comprender WPF y MVVM, y realmente estoy buscando orientación sobre cómo implementar componentes reutilizables de bajo nivel como este. Cualquier consejo general también será recibido y votado con agradecimiento. Tal como están las cosas, supongo que querré que UserControl:
Exponer una propiedad de dependencia "SelectedItem" que está vinculada al elemento Selected de DataGrid
Exponga un objeto RoutedEvent "ItemDoubleClick" o similar que se activa cuando el usuario hace doble clic en una fila.
Implemente
ICommandSource
y llame aCommandHelpers.ExecuteCommandSource(this)
desde la fila haga doble clic en el controlador de eventos.
Si el código detrás no es un problema:
<DataGrid.RowStyle>
<Style TargetType="{x:Type DataGridRow}">
<EventSetter Event="Loaded" Handler="Row_Loaded"/>
</Style>
</DataGrid.RowStyle>
private void Row_Loaded(object sender, RoutedEventArgs e)
{
var row = sender as DataGridRow;
row.InputBindings.Add(new MouseBinding(MyCommands.MyCommand,
new MouseGesture() { MouseAction = MouseAction.LeftDoubleClick }));
}
Simplemente puede poner DataGrid en una cuadrícula y definir sus InputBindings en la cuadrícula. En la definición canExecute, debe verificar, si se selecciona una fila. Eso también funciona para KeyBinding, por ejemplo, un Custom-Delete personalizado.
<Grid>
<Grid.InputBindings>
<MouseBinding MouseAction="LeftDoubleClick" Command="... />
</Grid.InputBindings>
<DataGrid IsReadOnly="True">
...
</Grid>