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

时间:2014-05-21 14:21:21

标签: c# wpf contextmenu

在我的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");
     }
 }

1 个答案:

答案 0 :(得分:0)

这可能过于简单了,但这里的代码可行 - 可能不是最优雅但功能齐全。

让您的窗口类保留对MenuItem 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;

希望这有帮助。