0

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>

コマンドが接続されている境界線をクリックすると、次のポップアップ エラーが表示されます。

「タイプ 'System.InvalidCastException' の未処理の例外が GalaSoft.MvvmLight.WPF4.dll で発生しました

追加情報: タイプ 'System.Windows.Input.MouseButtonEventArgs' のオブジェクトをタイプ 'System.Windows.DependencyObject' にキャストできません。"

私のコマンドは、次のように viemModel で作成されます。

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

私は何を間違えましたか?

4

1 に答える 1

4

エラー メッセージは一目瞭然RelayCommand<DependencyObject>です。コマンド パラメータが であると予想していましたDependencyObjectMouseButtonEventArgs、イベントにサブスクライブしたため、正常な が表示されましたMouseDown

イベントが発生すると、次のEventToCommandいずれかのパラメーターを使用してコマンドが実行されます。

  • の値がそうでない場合、CommandParameterそれ nullパラメーターとして使用するため、コマンドは次のようになります。RelayCommand<typeOfTheSpecifiedCommandPameter>
  • PassEventArgsToCommand='true' およびの値が である CommandParameter場合、nullコマンド パラメータとして eventargs を使用します。したがって、コマンドを として定義する必要があります RelayCommand<MouseButtonEventArgs>
  • である場合PassEventArgsToCommand='false' コマンドCommandParameterまったく実行nullされません。

ノート:

そのため、2 つのケースに対してコマンドを異なる方法で定義する必要があります。必要に応じてRelayCommand<object>、パラメーターの型を使用して確認する必要があります。PassEventArgsToCommandそのため、CommandParameter同時に使用するのは悪い習慣だと思います。

例外に戻る:

あなたの場合、シームCommandParameter="{Binding Videos}"はnullを返すためMouseButtonEventArgs、コマンドパラメーターとしてを取得します。

が null である理由を理解する{Binding Videos}には、実行時に VS の [出力] ウィンドウをチェックして、バインディング エラーを探します。

于 2012-02-01T19:50:45.677 に答える