问题
I am trying to add a context menu for my data grid that will display a certain menu item header depending on the selected row. For example if the row is not marked for deletion there will be a menu item "Mark for deletion". Otherwise it will say "Unmark for deletion".
I don't think I am setting the DataContext for the ContextMenu correctly, so I am unable to get information from the selected row.
<DataGrid Grid.Row="0" Name="OrdersGrid"
ItemsSource="{Binding Path=Orders}" IsSynchronizedWithCurrentItem="True"
AutoGenerateColumns="False"
SelectedItem="{Binding Path=CurrentlySelected,Mode=OneWayToSource}"
ContextMenuOpening="AddItemHeader">
<DataGrid.ContextMenu>
<ContextMenu DataContext="{Binding Path=PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}">
<MenuItem Header="dummy"
Click="MarkForDeletion">
</MenuItem>
.
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 (Object o in menu.Items) {
if (o is MenuItem)
{
if ((string)(o as MenuItem).Header == "dummy")
{
menuItem = o as MenuItem;
}
}
}
if (menuItem == null) {
Console.WriteLine("Item not found!");
return;
}
if (menu.DataContext == null)
{
Console.WriteLine("Data Context not found!");
return;
}
OrderModel selectedItem = menu.DataContext as OrderModel;
if (selectedItem == null)
{
Console.WriteLine("Can't get order from row!");
return;
}
if (selectedItem.MarkedForDeletion)
{
menuItem.Header = "Unmark for deletion";
}
else
{
menuItem.Header = "Mark for deletion";
}
}
Output:
ContextMenuOpening fired.
Data Context not found!
来源:https://stackoverflow.com/questions/23764013/cant-find-datacontext-in-contextmenuopening