2011-10-07 6 views
0

마크 업에서 선언 되었는데도 CommandParameter가 때때로 (항상 그런 것은 아님) null 인 이유는 무엇입니까?

다음과 비슷한 코드가 있습니다.

<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 번 ​​더 인쇄하면 var enumValue = (SomeEnum)commandParameter 줄에 NullReferenceException가 나타납니다 (commandParameter는 null 임).

나 인생의 이유로 CommandParameter가 처음 몇 번 CanExecute이 올바르다는 이유를 생각할 수는 없지만 null은 나중에 호출됩니다. 여기서 무슨 일이 일어나고있는거야?

답변

3

내가 직면 한 컨텍스트 메뉴의 명령 술어 기능에 문제가있었습니다. 이것은 당신을 도울 수 - 가 WPF CommandParameter is NULL first time CanExecute is called

ICommand.CanExecute being passed null even though CommandParameter is set

+1

두 번째 링크가 나는 데 같은 문제가 나타납니다. WPF 자체의 버그 인 것 같습니다. 'commandParameter'가'null' 일 때'false'를 반환함으로써이 문제를 해결할 수 있었지만 귀하의 마일리지는 다를 수 있습니다. –

+0

예. 그것은 버그입니다. 내 문제를 버튼 목록으로 줄였습니다. 그것은 그 목록 주위에 원본 페이지를 구축하는 것을 쳐다 보았다. 나는 그것을 완전히 만들었고 지금은 효과가있다. 원래보기와 똑같은 문자의 XAML 문자입니다. 이것은 가장 확실한 버그입니다. 내가보고 할 재현 가능한 증거가 있었으면 좋겠다. 이들은 결코 해결되지 않는 버그 유형입니다. – Jordan