如何在单击上下文菜单项时禁用它

本文关键字:菜单项 上下文 单击 | 更新日期: 2023-09-27 18:04:38

在我的WPF项目中,有一个上下文菜单。当单击上下文菜单项时,我应该在视图模型中禁用该项。

var cm = new ContextMenu();    
var disableItem= new MenuItem
{
    Header = "Disable",
    Command = new DelegateCommand(() =>
    {                        
        // here we need to disable this menu item. 
    })
};    
cm.Items.Add(disableItem);

cm绑定到xaml。我怎样才能做到这一点呢?

尝试以下代码,但仍然不能工作,有人可以帮助什么是错误的在这里?

private ContextMenu CreateContextMenu()
{
  var cm = new ContextMenu();
  var mItemDisable = new MenuItem{
        Header = "Dynamic Disable",
        Command = new DelegateCommand(() =>
        { IsContextItemEnabled = false; })};
  var binding = new Binding();
  binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
  binding.Mode = BindingMode.OneWay;
  binding.Source = IsContextItemEnabled;
  mItemDisable.SetBinding(MenuItem.IsEnabledProperty, binding);
  cm.Items.Add(mItemDisable);
  return cm;
}
private bool _isContextItemEnabled = true;
private bool IsContextItemEnabled
{
   get { return _isContextItemEnabled; }
   set
     {
      _isContextItemEnabled = value;
      NotifyPropertyChanged("IsContextItemEnabled");
     }
 }

如何在单击上下文菜单项时禁用它

这可能过于简化了事情,但是这里的代码可以工作-可能不是最优雅的,但功能齐全。

让您的窗口类保持对菜单项MenuItem m_disableItem = null;的成员变量引用

然后,让它实现一个方法来禁用MenuItem:

void DisableItem()
{
    m_disableItem.IsEnabled = false;
}

最后,让委托调用那个方法:

var cm = new ContextMenu();
// Keep the menuItem as a member variable
m_disableItem = new MenuItem
{
    Header = "Disable",
    Command = new DelegateCommand((parameter) => this.DisableItem())
};
cm.Items.Add(m_disableItem);
编辑:

我不确定我是否同意这里应用的模式,但是您可以使用MenuItem's CommandParameter将发送的MenuItem返回给DelegateCommand:

var cm = new ContextMenu();
var disableItem = new MenuItem
{
    Header = "Disable",
    Command = new DelegateCommand<MenuItem>((parameter) =>
        {
            parameter.IsEnabled = false;
        })
};
disableItem.CommandParameter = disableItem;
cm.Items.Add(disableItem);
this.ContextMenu = cm;