Silverlight Datagrid sélectionnez un clic droit

Y at-il un moyen pour un événement de clic droit de sélectionner une ligne dans la grid de données de la boîte à outils?

J’utilise le menu contextuel de la boîte à outils qui fonctionne bien, mais le problème est que seul le clic gauche permet 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.

Toute aide est appréciée

Vous pouvez trouver une solution ici .

En gros, ça se passe comme ça:

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; } 

C’est un comportement qui fera l’affaire pour vous (inspiré par ce billet de blog ):

 public class SelectRowOnRightClickBehavior : Behavior { 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() .FirstOrDefault(); if (row != null) AssociatedObject.SelectedItem = row.DataContext; } } 

Utilisez-le comme ceci:

      

Merci bonne idée. Mais l’événement with UnloadingRow aurait pu être plus efficace avait été spécifié.

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

Ce projet open source sur Codeplex prend en charge ce problème immédiatement et fait bien plus que cela:

http://sl4popupmenu.codeplex.com/

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 ce n’est pas nécessaire, mais comme je ne travaillais pas avec de grandes quantités de données, cela fonctionne plutôt bien. La seule chose que je n’ai pas dans cet exemple, c’est la commande à utiliser pour effectuer l’action. Vous pouvez utiliser une commande sur l’object 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); }