以编程方式将控件作为 CommandParameter 传递

Passing the control as CommandParameter programmatically

试图在xaml中传递控制时,我们编写如下代码:

<MenuItem x:Name="NewMenuItem" Command="{Binding MenuItemCommand}" CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type MenuItem}}}" />

我正在尝试以编程方式创建一个 MenuItem,如下所示:

var pluginMenuItem = new MenuItem
{
    Header = "NewMenuItem, 
    Command = MenuItemCommand,
    CommandParameter = "{Binding RelativeSource= {RelativeSource Mode=FindAncestor, AncestorType={x:Type MenuItem}}}"
};

这将 string "{Binding RelativeSource= {RelativeSource Mode=FindAncestor, AncestorType={x:Type MenuItem}}}" 作为 CommandParameter

我错过了什么?

您可以使用下面提到的代码实现目标

你的 xaml 代码看起来像

 <Menu Name="menu" ItemsSource="{Binding MenuList,Mode=TwoWay}">
  </Menu>

你的 ViewModel 看起来像

public class MainViewModel : ViewModelBase
{
    /// <summary>
    /// Initializes a new instance of the MainViewModel class.
    /// </summary>
    public MainViewModel()
    {
        MenuList.Add(new MenuItem()
        {
            Header = "MenuItem1",
            Command = MenuItemCommand,
            CommandParameter = "FirstMenu"
        });
        MenuList.Add(new MenuItem()
        {
            Header = "MenuItem2",
            Command = MenuItemCommand,
            CommandParameter = "SecondMenu"
        });
    }

    private ObservableCollection<MenuItem> _menuList;

    public ObservableCollection<MenuItem> MenuList
    {
        get { return _menuList ?? (_menuList = new ObservableCollection<MenuItem>()); }
        set { _menuList = value; RaisePropertyChanged("MenuList"); }
    }

    private RelayCommand<string> _MenuItemCommand;

    public RelayCommand<string> MenuItemCommand
    {
        get { return _MenuItemCommand ?? (_MenuItemCommand = new RelayCommand<string>(cmd)); }
        set { _MenuItemCommand = value; }
    }

    private void cmd(string value)
    {
        MessageBox.Show(value);
    }
}