0

我的代码大致如下:

<MenuItem Header="Do Something"
          Command="{Binding ChangeSomeEnumValue}"
          CommandParameter="{x:Static someNamespace:SomeEnum.EnumValue}" />

在用作 DataContext 的视图模型中:

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

我一辈子都想不出一个为什么CommandParameter会正确的原因,前几次CanExecute被称为,但null另一次。这里发生了什么?

4

1 回答 1

4

我遇到的上下文菜单的命令谓词功能存在一些问题。这可能会对您有所帮助 - 第一次调用 CanExecute 时 WPF CommandParameter 为 NULL

即使设置了 CommandParameter,ICommand.CanExecute 也被传递为 null

于 2011-10-08T09:17:50.977 回答