I take on MenuItems and MVVM (it was not easy to put icons there)
public class MenuItemVM { public string Text { get; set; } public List<MenuItemVM> Children { get; set; } public ICommand Command { get; set; } public ImageSource Icon { get; set; } } public IList<MenuItemVM> AddContextMenu { get; set; }
View:
<Image x:Key="MenuItemIcon" x:Shared="false" Source="{Binding Icon}" Height="16px" Width="16px"/> <Style x:Key="ContextMenuItemStyle" TargetType="{x:Type MenuItem}"> <Setter Property="MenuItem.Icon" Value="{StaticResource MenuItemIcon}"/> <Setter Property="MenuItem.Command" Value="{Binding Command}" /> <Style.Triggers> <DataTrigger Binding="{Binding}" Value="{x:Null}"> <Setter Property="Template" > <Setter.Value> <ControlTemplate> <Separator Style="{StaticResource {x:Static MenuItem.SeparatorStyleKey}}"/> </ControlTemplate> </Setter.Value> </Setter> </DataTrigger> </Style.Triggers> </Style>
Add context menu to user interface
<ContextMenu ItemContainerStyle="{StaticResource ContextMenuItemStyle}" ItemsSource="{Binding AddContextMenu}"> <ContextMenu.Resources> <HierarchicalDataTemplate DataType="{x:Type vmp:MenuItemVM}" ItemsSource="{Binding Children}"> <TextBlock Text="{Binding Text}"/> </HierarchicalDataTemplate> </ContextMenu.Resources> </ContextMenu>
source share