简体   繁体   中英

Create Hierarchical ContextMenu dynamically MVVM

I would like to create dynamically Hierarchical ContextMenu from data in ViewModel.

In ViewMode, I defined ContextMenuAction:

public class ContextMenuAction : ViewModelBase
{
    public string Header { get; set; }
    public ICommand Action { get; set; }
    public Brush Icon { get; set; }
    public ObservableCollection<ContextMenuAction> SubActions { get; set; } = new ObservableCollection<ContextMenuAction>();
}

In View:

<ContextMenu ItemsSource="{Binding Path=PlacementTarget.Tag.Actions, RelativeSource={RelativeSource Self}}">
<ContextMenu.ItemTemplate >
    <DataTemplate DataType="MenuItem">
        <MenuItem/>
    </DataTemplate>
</ContextMenu.ItemTemplate>

<ContextMenu.ItemContainerStyle>
    <Style TargetType="MenuItem">
        <Setter Property="ItemsSource" Value="{Binding SubActions}"/>
        <Setter Property="Header" Value="{Binding Header}" />
        <Setter Property="Command" Value="{Binding Action}"/>
    </Style>
</ContextMenu.ItemContainerStyle>

This is result, there no text in context menu.

在此处输入图片说明

I already check output window to check binding, all bindings work, there is no exception.

Please help me to find out the reason, thank in advance!

You should define a HierarchicalDataTemplate :

<ContextMenu ItemsSource="{Binding Path=PlacementTarget.Tag.Actions, RelativeSource={RelativeSource Self}}">
    <ContextMenu.ItemTemplate>
        <HierarchicalDataTemplate DataType="{x:Type local:ContextMenuAction}" ItemsSource="{Binding SubActions}">
            <TextBlock Text="{Binding Header}" />
        </HierarchicalDataTemplate>
    </ContextMenu.ItemTemplate>
    <ContextMenu.ItemContainerStyle>
        <Style TargetType="MenuItem">
            <Setter Property="Command" Value="{Binding Action}"/>
        </Style>
    </ContextMenu.ItemContainerStyle>
</ContextMenu>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM