尽管在标记中声明,为什么我的CommandParameter有时(但不总是)为null?

时间:2011-10-07 22:06:35

标签: c# .net wpf command relaycommand

我的代码大致如下:

<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)commandParametercommandParameter为空)。< / p>

我不能为我的生活考虑CommandParameter前几次CanExecute被调用的原因,而null是另一次{{1}}。这是怎么回事?

1 个答案:

答案 0 :(得分:3)

我遇到过Context Menu的命令谓词功能存在一些问题。这可能会帮助你 - WPF CommandParameter is NULL first time CanExecute is called

ICommand.CanExecute being passed null even though CommandParameter is set