右键单击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上的这个开源项目支持开箱即用的这种行为,并且做的远不止这些:
我尝试使用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); }