У меня есть код, который выглядит примерно так:
<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)commandParameter
(commandParameter
равно нулю).
Не могу себе представить причину, по которой CommandParameter
будет правильным в первые несколько раз, когда вызывается CanExecute
, а null
в другой раз. Что здесь происходит?