在我的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");
}
}
答案 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;
希望这有帮助。