我的代码大致如下:
<MenuItem Header="Do Something"
Command="{Binding ChangeSomeEnumValue}"
CommandParameter="{x:Static someNamespace:SomeEnum.EnumValue}" />
在用作DataContext的viewmodel中:
// RelayCommand takes an Action<object> to be used by Execute, and a
// Predicate<object> to be used by CanExecute.
this.ChangeSomeEnumValue = new RelayCommand(
p => this.CurrentEnumValue = (SomeEnum)p,
ChangeSomeEnumValuePredicate);
...
bool ChangeSomeEnumValuePredicate(object commandParameter)
{
Console.WriteLine(commandParameter);
var enumValue = (SomeEnum)commandParameter;
...
return true;
}
首次显示MenuItem
时,输出为:
EnumValue
EnumValue
EnumValue
当我点击MenuItem
“EnumValue”再打印3次后,我就会在NullReferenceException
上找到var enumValue = (SomeEnum)commandParameter
(commandParameter
为空)。< / p>
我不能为我的生活考虑CommandParameter
前几次CanExecute
被调用的原因,而null
是另一次{{1}}。这是怎么回事?
答案 0 :(得分:3)
我遇到过Context Menu的命令谓词功能存在一些问题。这可能会帮助你 - WPF CommandParameter is NULL first time CanExecute is called
ICommand.CanExecute being passed null even though CommandParameter is set