我正在尝试根据所选行的数据上下文替换上下文菜单中的标题。
ContextMenuOpening会触发,但是我无法从那里找到上下文菜单。
<UserControl ContextMenuOpening="AddItemHeader">
<UserControl.Resources>
<ContextMenu x:Key="RowMenu" DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}">
<MenuItem Header="<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>
<DataGrid.RowStyle>
<Style TargetType="{x:Type DataGridRow}">
<Setter Property="ContextMenu" Value="{StaticResource RowMenu}" />
[...]
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!");
}
}
仅输出&#34;未找到菜单!&#34;
答案 0 :(得分:0)
您正在将上下文菜单设置为每一行。 您找不到上下文菜单,因为ContextMenuOpening的发件人可能是网格而不是行。
我会将上下文菜单分配给datagrid,并在每个菜单项的事件处理程序中使用dataite的数据网格。
答案 1 :(得分:0)
试试这个:
var rowIndex = dataGrid.SelectedIndex;
var row = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromIndex(selectedIndex);
ContextMenu cm = row.ContextMenu;