【问题标题】:DataGrid + ContextMenu: How to get the row under the right clickDataGrid + ContextMenu:如何获取右键下的行
【发布时间】:2012-03-05 21:48:40
【问题描述】:

在 Silverlight 5 中,我有一个 DataGrid 和一个 ContextMenuService.ContextMenu。如果单击要选择的行,然后单击鼠标右键,则只需检查 grid.selecteditem 的上下文。但是,如果您右键单击一行而不选择它,则在打开菜单时您没有该行的上下文。 如何获取上下文菜单打开时右键单击的网格的DataContext行? 右键单击​​网格似乎是一个选项,但它被截获为上下文菜单和除非上下文菜单已经打开/聚焦,否则不会触发。

我找到了大量解决 Silverlight 4 的原始问题并在右键单击时检测行的示例。但是,上下文菜单现在拦截了网格的右击,所以那些没有记录器的工作。我还发现了有关 ContextMenu 初始版本的“错误”的帖子。所有这些帖子/博客都让您很难找到当前的答案或解决方案。

【问题讨论】:

  • ... 还没有解决办法。现在,如果 grid.selectedItem 为空,我会提示用户选择一行。此外,在上下文菜单起作用后,我取消选择当前的 grid.selected 项。

标签: silverlight datagrid contextmenu silverlight-5.0


【解决方案1】:

是的,Silverlight 5 似乎改变了一些东西,打破了旧把戏。

我们一直在这样做:在行加载处理程序上添加行输入。例如:

private void DataGrid_LoadingRow(object sender, DataGridRowEventArgs e)
{
        e.Row.MouseEnter += new MouseEventHandler(Row_MouseEnter);
        e.Row.MouseLeave += new MouseEventHandler(Row_MouseLeave);
}


void Row_MouseEnter(object sender, MouseEventArgs e)
{
        DataGridRow dgr = sender as DataGridRow;
        IncidentGrid.SelectedItem = dgr.DataContext;
}

我知道这很丑,但它正在工作。

【讨论】:

  • 是的,我也玩过这个,但不敢完全相信它。我担心的是,对于这个应用程序.. 如果用户对一行进行操作(右键单击)并且这有任何方式不会触发该鼠标输入事件,那将是非常糟糕的。我赞成,但仍然希望有更好的解决方案。谢谢
【解决方案2】:

除了 Roger 对准确性的担忧之外,我不想在每一行都连接这些事件,因为我的网格非常大,而且我必须保持精简。

我在这里找到了解决方案...

https://mutelight.org/silverlight-datagrid-make-right-click-select-a-row

仅对网格的 MouseRightButtonDown 事件应用一个事件处理程序。事件 args 具有鼠标位置,您可以使用 VisualTreeHelper 查找鼠标在哪个 DataGridRow 上。然后该行的 DataContext 将包含您的 SelectedItem。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    相关资源
    最近更新 更多