MenuItem数据绑定

时间:2012-02-01 18:23:04

标签: wpf xaml data-binding contextmenu menuitem

我一直在困惑这一天没有运气 - 我可能错过了一些明显的东西。基本上,我有一个包含两个项目的上下文菜单。一个是静态声明的,并绑定到一个命令。另一个没有自己的命令,但绑定到一组视图模型。所以在视觉上菜单看起来应该是这样的:

  • 删除
  • 添加
    • 第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>

哪个有效,但给了我其他人经历过的嵌套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>

1 个答案:

答案 0 :(得分:1)

显然这是3.5中的错误。我将项目升级到4.0,现在一切都按预期工作。