web-dev-qa-db-ja.com

イベントを介したWPF呼び出しコマンド

WPFのイベントを介してコマンドを呼び出すことはできますか?

押されたときにコマンドを呼び出す保存ボタンがあります。これは、テキストボックスの編集が終了したときに押され、オブジェクトをコマンドパラメータとして渡します。

 <Button Content="Save"  Command="{Binding DataContext.SaveQueueTimeCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}}" CommandParameter="{Binding}" />

理想的には、このコマンドを呼び出して、テキストボックスがフォーカスを失ったときにオブジェクトをパラメーターとして渡します。ボタンを押す必要はなく、次のようなものです。

 <Button LostFocus="{Binding SaveQueueTimeCommand}" />

そして、なんとかしてオブジェクトをパラメーターとして渡します。 MVVMパターンを使用しているため、コードビハインドを使用せずにこれを達成する方法はありますか

御時間ありがとうございます

37
Suiva

これを行う最も簡単な方法は、対話トリガーを使用することです。

<Grid xmlns:i="http://schemas.Microsoft.com/expression/2010/interactivity">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="SomeEvent">
            <i:InvokeCommandAction Command="{Binding Path=SomeCommand, Mode=OneWay}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</Grid>

後世のためにこれを追加しました。

70
Trevor

アタッチされたビヘイビアーを使用してこれを実現できます。 Marlon GrechAttached Command Behaviors ライブラリを作成して、トラブルを回避しています。使用法は次のようになります。

<Grid>
    <local:CommandBehaviorCollection.Behaviors>
        <local:BehaviorBinding Event="MouseRightButtonDown" Command="{Binding SomeCommand}" CommandParameter="A Command on MouseRightButtonDown"/>
    </local:CommandBehaviorCollection.Behaviors>
</Grid>
15
Kent Boogaart
<Grid MouseRightButtonDown ="{eb:EventBinding Command=SomeCommand, CommandParameter=$e}">

</Grid>

コマンド

{eb:EventBinding} (Simple naming pattern to find Command)

{eb:EventBinding Command=CommandName}

CommandParameter

$e (EventAgrs) 

$this or $this.Property

string

https://github.com/JonghoL/EventBindingMarkup

3
jongho

どうしたいのか考えられないと思います。コマンドはデリゲートではないため、イベントまでコマンドを書き込むことはできません。私はあなたの最良の選択肢はButton.LostFocusイベントの後に、ハンドラーからコマンドを手動で実行します。

MVVMを使用する場合、コードをコードビハインドに配置しても問題はありません。コードを最小化し、コードを保持して関連タスクのみを表示するのが最善です。このコードビューを関連と呼ぶので、コードを背後のコードに配置することがわかります。

3
Andy