Я ломал голову над этим в течение дня или около того без удачи - я, вероятно, упускаю что-то очевидное. По сути, у меня есть контекстное меню с двумя пунктами. Один статически объявлен и привязан к команде. Другой не имеет собственной команды, но связывается с коллекцией моделей представления. Так что визуально меню должно выглядеть примерно так:
Где элементы меняются в зависимости от того, с чем связано контекстное меню. Изначально у меня было что-то вроде этого:
<ContextMenu x:Key="itemContextMenu">
<MenuItem Header="_Delete"
Command="{Binding DeleteCommand}" />
<MenuItem Header="_Add" DataContext=""
ItemsSource="{Binding AvailableTypes}">
<MenuItem.ItemTemplate>
<DataTemplate>
<MenuItem Header="{Binding Path=ItemType.Name}"
Command="{Binding Path=AddItemCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Grid}}"
CommandParameter="{Binding}" />
</DataTemplate>
</MenuItem.ItemTemplate>
</MenuItem>
</ContextMenu>
Что работает, но дает мне вложенные элементы MenuItem, с которыми сталкивались другие. Основываясь на паре потоков здесь на stackoverflow, я тогда попробовал это:
<ContextMenu x:Key="itemContextMenu">
<MenuItem Header="_Delete"
Command="{Binding DeleteCommand}" />
<MenuItem Header="_Add"
ItemsSource="{Binding AvailableTypes}">
<MenuItem.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="Header"
Value="{Binding Path=ItemType.Name}" />
<Setter Property="Command"
Value="{Binding Path=AddItemCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Grid}}" />
<Setter Property="CommandParameter"
Value="{Binding}" />
</Style>
</MenuItem.ItemContainerStyle>
</MenuItem>
</ContextMenu>
Однако, когда я это делаю, все мои привязки терпят неудачу с такими ошибками, как:
Ошибка пути BindingExpression: свойство 'ItemType' не найдено в 'object' '' String '
Ошибка пути BindingExpression: свойство 'AddItemCommand' не найдено в 'объекте' '' Сетка '
Для меня это говорит о том, что DataContext теряется, когда я использую ItemContainerStyle. Чего мне не хватает?
редактирование:
Я думаю, что у меня здесь было несколько красных сельдей, поэтому я еще больше упростил примеры, чтобы попытаться сузить проблему.
Работает, но по-разному:
<ContextMenu x:Key="itemContextMenu">
<MenuItem Header="_Delete" />
<MenuItem Header="_Add" DataContext=""
ItemsSource="{Binding AvailableTypes}">
<MenuItem.ItemTemplate>
<DataTemplate>
<MenuItem Header="{Binding Path=ItemType.Name}" />
</DataTemplate>
</MenuItem.ItemTemplate>
</MenuItem>
</ContextMenu>
Не работает с ошибкой BindingExpression:
<ContextMenu x:Key="itemContextMenu">
<MenuItem Header="_Delete" />
<MenuItem Header="_Add"
ItemsSource="{Binding AvailableTypes}">
<MenuItem.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="Header"
Value="{Binding Path=ItemType.Name}" />
</Style>
</MenuItem.ItemContainerStyle>
</MenuItem>
</ContextMenu>