我一直在困惑这一天没有运气 - 我可能错过了一些明显的东西。基本上,我有一个包含两个项目的上下文菜单。一个是静态声明的,并绑定到一个命令。另一个没有自己的命令,但绑定到一组视图模型。所以在视觉上菜单看起来应该是这样的:
根据上下文菜单绑定的内容,项目的位置会有所不同。最初我有这样的事情:
<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>
哪个有效,但给了我其他人经历过的嵌套MenuItems。基于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路径错误:'object'''String'上找不到'ItemType'属性
BindingExpression路径错误:'对象'''网格'上找不到'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>
答案 0 :(得分:1)
显然这是3.5中的错误。我将项目升级到4.0,现在一切都按预期工作。