2011-04-27 59 views
9

he desarrollado un control de usuario de WPF que está destinado a ser utilizado como una lista de selección de la siguiente manera:Cómo enlazar un comando al hacer doble clic en una fila en la cuadrícula de datos

  • Un DataGrid enlazado a un CollectionView de entidades (por ejemplo, de empleados)
  • Un cuadro de texto sobre el DataGrid que se puede utilizar para filtrar los elementos que se muestran en el 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 tratado de 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 con el botón aún se activa cuando el usuario hace clic en el encabezado de 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?

ACTUALIZACIÓN

sólo estoy llegar a enfrentarse con WPF y MVVM, y estoy realmente en busca de orientación sobre la forma de aplicar los componentes reutilizables de bajo nivel como este. Cualquier consejo general también será recibido y votado con gratitud. En su forma actual, estoy suponiendo que querré este control de usuario para:

  • exponer una propiedad de dependencia "SelectedItem" que está obligado a SelectedItem de la cuadrícula de datos

  • exponer una RoutedEvent "itemDoubleClick" o similar que se dispara cuando el usuario hace doble clic en una fila.

  • Implemente ICommandSource y llame al CommandHelpers.ExecuteCommandSource(this) desde la fila haga doble clic en el controlador de eventos.

Respuesta

10

Si 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 })); 
} 
+0

+1 gracias - esto es exactamente lo que quiero lograr, pero me preguntaba si hay una manera declarativa de hacerlo. – Joe

+0

Dudo que haya una manera fácil; puede canalizar eventos a comandos usando 'Interactivity' del [Blend SDK] (http://www.microsoft.com/downloads/en/details.aspx?FamilyID=f1ae9a30-4928-411d-970b-e682ab179e17&displaylang=en) y un 'EventToCommandAction', el problema es que usar Interactivity en un estilo es ** muy complicado **, pero si no te importa el problema [hay maneras] (http://stackoverflow.com/questions/1647815/how- to-add-a-blend-behavior-in-a-style-setter/4779168 # 4779168). –

+0

@HB Estoy empezando a entender con MVVM y quiero besarme por ahora, así que creo que buscaré una solución de código subyacente.Un comentario acerca de su solución: presumiblemente, crea una vinculación de mouse para cada fila a medida que se agrega a DataGrid. ¿Podría ser esto un poco ineficiente si hay una gran cantidad de filas? Si voy por la ruta del código subyacente, me pregunto si sería más eficiente manejar el evento DataGrid.MouseDoubleClick, dar clic en la prueba para asegurarme de que estoy en una fila, y luego ejecutar el comando. – Joe

0

usted puede poner simplemente la cuadrícula de datos 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> 
+0

Después de agregar esto, mi aplicación se congela. –

+0

El problema con esto es que puede hacer doble clic en cualquier parte de la cuadrícula para activar el comando una vez que se selecciona una fila, no solo en la misma fila. –

Cuestiones relacionadas