2010-06-15 4 views
6

C'è un modo per un evento clic destro per selezionare una riga nel toolkit datagrid?Silverlight Datagrid selezionare con il tasto destro del mouse

Sto usando il menu di scelta rapida del toolkit che funziona bene, ma il problema è, solo il clic sinistro è in grado di selezionare le righe, e ho bisogno di fare clic destro per poterlo fare se voglio che il mio menu contestuale funzioni correttamente.

Ogni aiuto è apprezzato

risposta

5

Si può trovare una soluzione here.

In sostanza va in questo modo:

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

E' un peccato che abbiamo dovuto usare hack così, ma suppongo sia meglio di niente. Grazie –

+0

L'evento MouseRightButtonDown è disponibile solo da SL 4.0. C'è qualche altra soluzione per il clic destro in SL 3.0? – vijaysylvester

1

Grazie buona idea. Ma l'evento UnloadingRow avrebbe potuto essere più efficace se fosse stato specificato.

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

ho provato un approccio leggermente diverso utilizzando l'evento LoadingRow nel DataGrid. Non mi piace usare quell'evento particolare se non dovessi farlo, ma dal momento che non stavo lavorando con grandi quantità di dati, funziona abbastanza bene. L'unica cosa che non ho in questo esempio è il comando da utilizzare per eseguire l'azione. È possibile utilizzare un comando sull'oggetto DataContext o qualche altro meccanismo.

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

E 'un comportamento che farà il trucco per voi (ispirato da questo 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; 
    } 
} 

Utilizzare in questo modo:

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