2010-06-15 10 views
6

¿Hay alguna manera de hacer clic con el botón derecho del evento para seleccionar una fila en toolkit datagrid?Silverlight Selección de cuadrícula de datos al hacer clic con el botón derecho

estoy usando el menú contextual conjunto de herramientas que funciona muy bien, pero el problema es que sólo clic izquierdo es capaz de seleccionar filas, y necesito clic derecho de ser capaz de hacer eso si quiero que mi menú contextual para que funcione correctamente.

Cualquier ayuda se agradece

Respuesta

5

puede encontrar una solución here.

Básicamente dice así:

private void dg_LoadingRow(object sender, DataGridRowEventArgs e) 
{ 
    e.Row.MouseRightButtonDown += new MouseButtonEventHandler(Row_MouseRightButtonDown); 
} 
void Row_MouseRightButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    dg.SelectedItem = ((sender) as DataGridRow).DataContext; 
} 
+0

es una lástima que tenga que usar hacks así, pero supongo que es mejor que nada. Gracias –

+0

El evento MouseRightButtonDown solo está disponible desde SL 4.0. ¿Hay alguna otra solución para hacer clic derecho en SL 3.0? – vijaysylvester

1

Gracias buena idea. Pero el evento con UnloadingRow podría haber sido más efectivo había sido especificado.

private void dg_UnloadingRow(object sender, System.Windows.Controls.DataGridRowEventArgs e) 
{ 
    e.Row.MouseRightButtonDown -= Row_MouseRightButtonDown; 
} 
0

He intentado un enfoque ligeramente diferente utilizando el evento LoadingRow en la cuadrícula de datos. No me gusta usar ese evento en particular si no es necesario, pero como no estaba trabajando con grandes cantidades de datos, funciona bastante bien. Lo único que no tengo en esta muestra es el comando que debo usar para realizar la acción. Puede usar un comando en el objeto DataContext o algún otro mecanismo.

private void DataGrid_LoadingRow(object sender, DataGridRowEventArgs e) 
    { 
     var contextMenu = new ContextMenu(); 

     var deleteMenuItem = new MenuItem {Header = "Delete User"}; 

     contextMenu.Items.Add(deleteMenuItem); 

     ContextMenuService.SetContextMenu(e.Row, contextMenu); 

    } 
3

Él es un comportamiento que va a hacer el truco para usted (inspirado en este blog post):

public class SelectRowOnRightClickBehavior : Behavior<DataGrid> 
{ 
    protected override void OnAttached() 
    { 
     base.OnAttached(); 

     AssociatedObject.MouseRightButtonDown += HandleRightButtonClick; 
    } 

    protected override void OnDetaching() 
    { 
     base.OnDetaching(); 

     AssociatedObject.MouseRightButtonDown += HandleRightButtonClick; 
    } 

    private void HandleRightButtonClick(object sender, MouseButtonEventArgs e) 
    { 
     var elementsUnderMouse = VisualTreeHelper.FindElementsInHostCoordinates(e.GetPosition(null), AssociatedObject); 

     var row = elementsUnderMouse 
      .OfType<DataGridRow>() 
      .FirstOrDefault(); 

     if (row != null) 
      AssociatedObject.SelectedItem = row.DataContext; 
    } 
} 

utilizar de esta manera:

<sdk:DataGrid x:Name="DataGrid" Grid.Row="4" 
        IsReadOnly="True" 
        ItemsSource="{Binding MyItems}"> 
     <i:Interaction.Behaviors> 
      <b:SelectRowOnRightClickBehavior/> 
     </i:Interaction.Behaviors> 
</sdk:DataGrid> 
Cuestiones relacionadas