4

WPFButtonには、CommandにバインドできるパラメーターがありますICommand

<Button Command="{Binding SomeCommand}"/>

を使用EventTriggersInvokeCommandActionてを起動することもできますICommand

<Button>
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Click">
            <i:InvokeCommandAction Command="{Binding SomeCommand}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</Button>

それらといつ使用するかの違いは何ですか?

アップデート:

次のシナリオの違いに気づきました。

  • テキストボックスが空の場合にIValudationRuleを使用して検証するテキストボックスがあります。
  • MultiDataTrigger条件を追加して、Validation.HasErrorがtrueに等しい場合に保存ボタンのIsEnabledプロパティをfalseに設定するようにしました。

Buttonコマンドの使用はすべて正常に機能しますが、EventTriggerを使用しても機能しません。

これには何か理由がありますか?

4

2 に答える 2

2

を使用しない場合、提供するスニペットはほとんど同じですCanExecuteInvokeCommandActionはネイティブWPFクラスではありません。コントロールが提供されず、Command を何らかのイベントにバインドする必要がInteractionある場合に備えて、ライブラリに作成されます。Commandたとえば、コマンドが必要な場合ListBox.SelectionChangedなどです。

したがって、上記に基づいて、私の提案は、可能な場合は常に Command を使用し、それEventTriggerなしでは行けない場合にのみ使用することです。

また、どのボタンを有効/無効にできるかに基づいてICommand提供することにも注意してください。これは2番目のケースでは機能しませんCanExecute

于 2012-12-06T13:46:40.010 に答える
0

わずかな違い (CanExecute) がありますが、それ以外は、コードのどの部分がイベント/コマンドをサブスクライブしているかの問題です。AnはandメソッドをICommand公開するので...ExecuteCanExecute

ButtonBaseの Command プロパティは、Click イベントをコマンドの Execute イベントに自動的にリレーし、発生したコマンドの CanExecute に基づいて無効/有効化されたプロパティを変更します... 内部で (ワイヤーアップについて心配する必要はありません)。

ライブラリは同じことを行いますInteractionが、さまざまなクラスを公開して、独自のワイヤアップを簡単な方法で「構築」できるようにします。基本的に、「イベント名(ButtonBase.Click) イベントを配線して、指定されたコマンド(SomeCommand)の ICommand.Execute メソッドを呼び出す」というクラスをいくつか作成しています。

実際、これらのオプションの両方を忘れると、コード ビハインドで独自のものをロールバックすることもできます... しかし、繰り返しますが、素敵な、クリーンで、ボンネットの下で、ユニットテストされ、最適化された方法ですか?

于 2012-12-06T13:47:32.347 に答える