Вы должны увидеть это в окне вывода Visual Studio:
Ошибка System.Windows.Data: 4: невозможно
найти источник для привязки со ссылкой
'ElementName = я'.
BindingExpression: Path = MenuText;
DataItem = NULL; целевой элемент
'MenuItem' (Name = ''); целевое свойство
is 'Header' (тип 'Object')
Это связано с тем, что ContextMenu отключено от VisualTree, поэтому привязку нужно выполнять по-другому.
Один из способов - через ContextMenu.PlacementTarget
(который должен быть сеткой), вы можете использовать его DataContext для установления привязки, например ::
<MenuItem Header="{Binding RelativeSource={RelativeSource AncestorType=ContextMenu}, Path=PlacementTarget.DataContext.MenuText}"/>
или настройте DataContext в самом ContextMenu:
<ContextMenu DataContext="{Binding RelativeSource={RelativeSource Self}, Path=PlacementTarget.DataContext}">
<MenuItem Header="{Binding Path=MenuText}"/>
</ContextMenu>
Если это не вариант (поскольку DataContext Grid не может быть Window / UserControl), вы можете попытаться передать ссылку на Window / UserControl через Tag
вашей Grid, например.
<Grid ...
Tag="{x:Reference self}">
<Grid.ContextMenu>
<!-- The DataContext is now bound to PlacementTarget.Tag -->
<ContextMenu DataContext="{Binding RelativeSource={RelativeSource Self}, Path=PlacementTarget.Tag}">
<MenuItem Header="{Binding Path=MenuText}"/>
</ContextMenu>
...
В качестве примечания: из-за этого поведения я стремлюсь определить вспомогательный стиль в App.xaml
, чтобы все ContextMenus «псевдо-наследовали» DataContext от их родителя:
<!-- Context Menu Helper -->
<Style TargetType="{x:Type ContextMenu}">
<Setter Property="DataContext" Value="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}"/>
</Style>