C# Can';在上下文菜单打开中找不到上下文菜单

C# Can';在上下文菜单打开中找不到上下文菜单,c#,wpf,contextmenu,C#,Wpf,Contextmenu,我试图根据所选行的数据上下文替换上下文菜单中的标题 ContextMenuOpening启动,但是我无法从中找到上下文菜单 <UserControl ContextMenuOpening="AddItemHeader"> <UserControl.Resources> <ContextMenu x:Key="RowMenu" DataContext="{Binding PlacementTarget.DataContext, RelativeSource

我试图根据所选行的数据上下文替换上下文菜单中的标题

ContextMenuOpening启动,但是我无法从中找到上下文菜单

<UserControl ContextMenuOpening="AddItemHeader">
  <UserControl.Resources>
    <ContextMenu x:Key="RowMenu" DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}">
        <MenuItem Header="&lt;to be set>"
                  Tag="delete menu item"
                  Click="MarkForDeletion">
        </MenuItem>
        [...]
    </ContextMenu>
    <Style x:Key="DefaultRowStyle" TargetType="{x:Type DataGridRow}">
        <Setter Property="ContextMenu" Value="{StaticResource RowMenu}" />
    </Style>
  </UserControl.Resources>

它只输出“找不到菜单!”

您正在为每一行设置上下文菜单。 您找不到上下文菜单,因为ContextMenuOpening的发送者可能是网格而不是行

我会将上下文菜单分配给datagrid,并在每个菜单项的事件处理程序中使用datagrid的selecteditem。

尝试以下操作:

var rowIndex = dataGrid.SelectedIndex;
var row = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromIndex(selectedIndex);
ContextMenu cm = row.ContextMenu;

谢谢,这让我找到菜单。但现在我似乎无法获取数据上下文来读取所选行。请参见此处:虽然此代码可以回答问题,但提供有关如何和/或为什么解决问题的附加上下文将提高答案的长期价值。
private void AddItemHeader(object sender, ContextMenuEventArgs e)
{
    Console.WriteLine("ContextMenuOpening fired.");

        FrameworkElement fe = e.Source as FrameworkElement;
        ContextMenu menu = fe.ContextMenu;

        if (menu == null)
        {
            Console.WriteLine("Menu not found!");
            return;
        }

        MenuItem menuItem = null;

        foreach (MenuItem mi in menu.Items) {
            if ((string)mi.Tag == "to be set") {
                menuItem = mi;
            }
        }

        if (menuItem == null) {
            return;
            Console.WriteLine("Item not found!");
        }
}
var rowIndex = dataGrid.SelectedIndex;
var row = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromIndex(selectedIndex);
ContextMenu cm = row.ContextMenu;