将图标添加到 WPF 中的动态菜单项

Adding Icon to Dynamic Menu item in WPF

我正在尝试动态生成 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 属性 传递。 需要一种方法将图标 属性 绑定到 MenuItem。 谢谢。

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

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