Почему мой CommandParameter иногда (но не всегда) равен нулю, несмотря на то, что он объявлен в разметке? - PullRequest
0 голосов
/ 08 октября 2011

У меня есть код, который выглядит примерно так:

<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 в другой раз. Что здесь происходит?

1 Ответ

3 голосов
/ 08 октября 2011

Возникла некоторая проблема с функцией предиката Команды контекстного меню, с которой я столкнулся.Это может вам помочь - WPF CommandParameter имеет значение NULL в первый раз, когда CanExecute вызывается

ICommand.CanExecute передается ноль, даже если CommandParameter установлен

...