如何在单击上下文菜单项时禁用它
本文关键字:菜单项 上下文 单击 | 更新日期: 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;