右键单击Silverlight Datagrid选择

有没有办法让右键单击事件在工具箱数据网格中选择一行?

我正在使用工具包上下文菜单很好地工作,但问题是,只有左键单击才能选择行,如果我希望我的上下文菜单正常工作,我需要右键单击才能这样做。

任何帮助表示赞赏

你可以在这里找到解决方案。

基本上它是这样的:

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

他是一个行为,将为你做到这一点(灵感来自这篇博文 ):

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

像这样用它:

      

谢谢你的好主意。 但是,指定UnloadingRow事件可能会更有效。

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

Codeplex上的这个开源项目支持开箱即用的这种行为,并且做的远不止这些:

http://sl4popupmenu.codeplex.com/

我尝试使用DataGrid中的LoadingRow事件稍微不同的方法。 如果我不需要,我不喜欢使用该特定事件,但由于我没有处理大量数据,因此效果非常好。 我在此示例中唯一没有的是用于执行操作的命令。 您可以在DataContext对象或其他一些机制上使用命令。

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