2010-06-15 7 views
6

Y a-t-il un moyen pour un événement de clic droit de sélectionner une ligne dans la grille de données toolkit? J'utilise le menu contextuel toolkit qui fonctionne bien, mais le problème est que seul le clic gauche est capable de sélectionner des lignes, et j'ai besoin d'un clic droit pour pouvoir le faire si je veux que mon menu contextuel fonctionne correctement.SilverLine Datagrid select sur clic droit

Toute aide est appréciée

Répondre

5

Vous pouvez trouver une solution here.

Fondamentalement, il va comme ceci:

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

Il est dommage que nous devons utiliser hacks comme ça, mais je suppose que c'est mieux que rien. Merci –

+0

L'événement MouseRightButtonDown est disponible uniquement à partir de SL 4.0. Y at-il une autre solution pour le clic droit dans SL 3.0? – vijaysylvester

1

Merci bonne idée. Mais l'événement avec UnloadingRow aurait pu être plus efficace a été spécifié.

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

J'ai essayé une approche légèrement différente en utilisant l'événement LoadingRow dans le DataGrid. Je n'aime pas utiliser cet événement particulier si je n'ai pas à le faire, mais comme je ne travaillais pas avec de grandes quantités de données, ça marche plutôt bien. La seule chose que je n'ai pas dans cet exemple est la commande à utiliser pour effectuer l'action. Vous pouvez utiliser une commande sur l'objet DataContext ou un autre mécanisme.

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

Il est un comportement qui fera l'affaire pour vous (inspiré par ce 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; 
    } 
} 

Utilisez comme ceci:

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