2012-02-01 3 views
0

EventToCommand를 통해 명령을 보내려는 다음과 같은 시각적 트리가 있습니다. 시각은 다음과 같다 :MVVM Light에서 EventToCommand 문제가 발생했습니다.

<Border Background="Gray" Grid.Row="0" Margin="2" VerticalAlignment="Bottom"> 
      <i:Interaction.Triggers> 
       <i:EventTrigger EventName="MouseDown"> 
        <cmd:EventToCommand 
       Command="{Binding ShowVideosCmd}" 
       PassEventArgsToCommand="True" 
       CommandParameter="{Binding Videos}"> 
        </cmd:EventToCommand> 

       </i:EventTrigger> 
      </i:Interaction.Triggers> 
</Border> 

명령이 다음과 같은 팝업 오류 얻을 I에 연결되어 국경 클릭 'System.InvalidCastException'형식의

"처리되지 않은 예외가 발생 GalaSoft.MvvmLight.WPF4.dll에서

추가 정보 : ' 를 입력 'System.Windows.Input.MouseButtonEventArgs '형식의 개체를 캐스팅 할 수 없습니다 System.Windows.DependencyO bject '. "

내 명령은 다음 다음과 같은 viemModel에서 생성됩니다

ShowVideosCmd = new RelayCommand<DependencyObject>(
    (dpObj) => 
      { 
       messenger.Default.Send<string>("ShowVideos"); 
      }, 
    (dpObj) => true 
); 

내가 무슨 짓을 잘못

답변

4

오류 메시지가 상당히 자기 설명이다 : 당신이 당신이 예상 한 RelayCommand<DependencyObject> 명령 매개 변수는 DependencyObject이지만 MouseDown 이벤트에 가입 했으므로 MouseButtonEventArgs이 정상입니다.

T RelayCommand<typeOfTheSpecifiedCommandPameter> 다음 CommandParameter의 값이 명령이 같아야하므로 은하지null가 매개 변수로 사용하는 경우

  • : 그는 이벤트는 다음 매개 변수 중 하나를 사용하여 명령을 exectues 화재 EventToCommand
  • PassEventArgsToCommand='true'의 값이 CommandParameter 인 경우 null 일 경우 매개 변수로 eventargs를 사용합니다. 따라서 명령을 RelayCommand<MouseButtonEventArgs>으로 정의해야합니다.
  • PassEventArgsToCommand='false'CommandParameter 인 경우 null실행되지 않습니다 모든 명령.

참고 :

그래서 당신이 두 경우에 다른 명령을 정의 할 필요가있다. 필요에 따라 RelayCommand<object>을 사용하고 매개 변수 유형을 확인해야합니다. 그래서 PassEventArgsToCommandCommandParameter을 동시에 사용하는 것은 나쁜 습관이라고 생각합니다.

위로 예외 : 귀하의 경우

CommandParameter="{Binding Videos}" 반환 명령 매개 변수로 MouseButtonEventArgs을받을 이유가 널 (null) 솔기.

{Binding Videos}이 null 인 이유를 알아 내기 위해 런타임 중에 출력 창에서 바인딩 오류를 찾을 수 있습니다.