在WPF中向动态菜单项添加图标

时间:2019-02-15 10:18:03

标签: wpf xaml menuitem

我正在尝试动态生成MenuItem。 如何将其绑定到样式?

这是代码。

XAML

<Window.Resources>        
    <Image x:Key="Image.Icon" 
     Source="pack://application:,,,/DynamicMenu;component/icon.png"/>        
</Window.Resources>        
<DockPanel>
    <Menu DockPanel.Dock="Top" ItemsSource="{Binding MenuItems}">
        <Menu.ItemContainerStyle>
            <Style TargetType="{x:Type MenuItem}">
                <Setter Property="Command" Value="{Binding Command}" />
                <Setter Property="Icon">
                    <Setter.Value>
                        <Image Source="{Binding ImagePath}" Width="12" Height="12" />
                    </Setter.Value>
                </Setter>
            </Style>
        </Menu.ItemContainerStyle>
        <Menu.ItemTemplate>
            <HierarchicalDataTemplate DataType="{x:Type local:MenuItemViewModel}" 
                                      ItemsSource="{Binding Path=MenuItems}">
                <StackPanel Orientation="Horizontal">                            
                    <TextBlock Text="{Binding Header}"/>
                </StackPanel>
            </HierarchicalDataTemplate>
        </Menu.ItemTemplate>
    </Menu>
    <Grid>
    </Grid>
</DockPanel>

ViewModel

public class MenuItemViewModel
{
    private readonly ICommand _command;

    public MenuItemViewModel()
    {
        _command = new CommandViewModel(Execute);
    }
    public string Header { get; set; }
    public string Param1 { get; set; }
    public string ImagePath { get; set; }
    public ObservableCollection<MenuItemViewModel> MenuItems { get; set; }
    public ICommand Command
    {    
        get {return _command; }
    }
    private void Execute()
    {
        MessageBox.Show("Clicked at " + Header + Param1);
    }
}

命令

public class CommandViewModel : ICommand
{
    private readonly Action _action;
    public CommandViewModel(Action action)
    {            
        _action = action;        
    }

    public void Execute(object o)        
    {
        _action();        
    }

    public bool CanExecute(object o)        
    {
        return true;        
    }

    public event EventHandler CanExecuteChanged
    {            
        add { }            
        remove { }        
    }
}

我想为不同的MenuItem添加一个不同的图标。 因此,我计划将图标文件作为MenuItemViewModel属性传递。 需要一种将icon属性绑定到MenuItem的方法。 谢谢。

1 个答案:

答案 0 :(得分:1)

我为我的问题找到了解决方案:

<MenuItem Header="{Binding Path=Header}" Command="{Binding PresentationTripLegCommand}">
    <MenuItem.Icon>
        <Image Source="{Binding IconFileName}" Height="16" />
    </MenuItem.Icon>
</MenuItem>