WPF 4.0数据绑定DataGrid上的ContextMenu

5

我试图在DataGrid上动态绑定ContextMenu,但是遇到了很大的困难。DataGrid绑定了一个对象列表,这部分工作非常顺利:

<DataGrid ItemsSource="{Binding DataGridItems}">

对于每个DataGridItem对象,我都有一个在属性上公开的MenuItem列表,我希望将其用于绑定到ContextMenu。 我尝试了以下内容,但我认为我漏掉了一些东西:

<DataGrid ItemsSource="{Binding DataGridItems}">
     <DataGrid.ContextMenu>
          <ContextMenu ItemsSource="{Binding ContextMenuItems}" >
               <MenuItem Header="{Binding Name}" Command="{Binding OnClick}"></MenuItem>
          </ContextMenu>
     </DataGrid.ContextMenu>
 <DataGrid>

public class DataGridItem
{
    public ObservableCollection<ContextMenuItem> ContextMenuItems
    {
        get { return _contextMenuItems; }
    }
}

任何帮助或指导都将不胜感激。

可能只是一个打字错误,但是你表示单个项目的类被称为“DataGridItems”?此外,发布更完整的代码可能会使故障排除更容易。 - Phil Sandler
你说得对,类名应该是DataGridItem。我会进行更新。 - Exist
2个回答

6
这是我最终解决问题的方法:
<StackPanel.ContextMenu>
<ContextMenu ItemsSource="{Binding ContextMenu}">
    <ContextMenu.ItemContainerStyle>
        <Style TargetType="MenuItem">
            <Setter Property="Command" Value="{Binding OnClick}" />
            <Setter Property="Icon">
                <Setter.Value>
                    <Image Source="{Binding ImageName}"></Image>
                </Setter.Value>
            </Setter>
        </Style>
    </ContextMenu.ItemContainerStyle>
    <ContextMenu.ItemTemplate>
        <HierarchicalDataTemplate DataType="{x:Type ContextMenu:ContextMenuItem}" ItemsSource="{Binding MenuItems}">
            <TextBlock Text="{Binding Name}"></TextBlock>
        </HierarchicalDataTemplate>
    </ContextMenu.ItemTemplate>
</ContextMenu>


这个对我来说几乎有效,但我需要将<Setter Property="Icon">块替换为<Setter Property="Icon" Value="{Binding ImageName}" /> - Chris Zeh

3
我相信这篇教程可以解决您的问题,但您需要执行以下操作:

<ContextMenu DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}"
    ItemsSource="{Binding ContextMenuItems}" />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接