WPF 4.0 Связывание данных с ContextMenu в DataGrid - PullRequest
5 голосов
/ 15 апреля 2011

Я чертовски стараюсь динамически связать ContextMenu с DataGrid. DataGrid привязан к списку объектов, который прекрасно работает:

<DataGrid ItemsSource="{Binding DataGridItems}">

Для каждого из объектов DataGridItem у меня есть список MenuItems для свойства, которое я хотел бы использовать для привязки к 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; }
    }
}

Любая помощь или руководство будет высоко ценится.

Ответы [ 2 ]

6 голосов
/ 23 апреля 2011

Вот так я и решил:

<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>

3 голосов
/ 15 апреля 2011

Я полагаю, этот урок описывает вашу проблему, но по сути вам придется сделать следующее:

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