我已经苦思冥想了一天,但还是没有找到答案——很可能我错过了什么显而易见的地方。基本上,我有一个带有两个项目的上下文菜单。一个是静态声明的,并绑定到一个命令。另一个没有自己的命令,但绑定到一组视图模型。因此,从视觉上看,菜单应该如下所示:
- 删除 - 添加 - 项目1 - 项目2
其中的项目取决于上下文菜单所绑定的内容。最初我的做法是这样的:
然而,当我这样做时,我的所有绑定都失败了,出现以下错误:
- 删除 - 添加 - 项目1 - 项目2
其中的项目取决于上下文菜单所绑定的内容。最初我的做法是这样的:
<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>
这个方法可以正常工作,但是会出现其他人遇到的嵌套菜单项问题。根据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路径错误:在“对象”'“String”'上未找到“ItemType”属性
BindingExpression路径错误:在“对象”'“Grid”'上未找到“AddItemCommand”属性
对我来说,这意味着当我使用ItemContainerStyle时,DataContext会丢失。我错过了什么?
编辑:
我认为我在这里有一些误导性的信息,所以我进一步简化了示例,以尝试缩小问题范围。
虽然布局有点奇怪,但是有效:
<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>