30

こんにちは、最近 WPF を調べて、イベントとコマンドについて学び始めました。私は通常、「ビューモデル」でメソッドを実行させるボタンクリックでコマンドを使用します。

コマンドを使用して、ボタンを MouseOver イベントなどの他のイベントに反応させることは可能ですか? または、この場合は WPF イベントを使用しますか?

WPF イベントを使用する場合、イベント ハンドラーの実装はビュー モデル内のメソッドを呼び出すだけで問題が発生しないようにする必要がありますか?

4

2 に答える 2

13

これは公正な質問であり、MVVM アーキテクチャ領域内で一般的ではあるが「解決済み」(議論の余地あり) な問題です。MVVM フレームワークを使用している場合は、EventToCommand の動作に似たものを見つける可能性があります。MVVM Light Toolkit のサンプルを次に示します。

つまり、これにより、次のようにイベントをコマンド バインディングにマップできます。

<Rectangle Fill="White"
       Stroke="Black"
       Width="200"
       Height="100">
<i:Interaction.Triggers>
    <i:EventTrigger EventName="MouseEnter">
        <cmd:EventToCommand Command="{Binding TestCommand,
                                      Mode=OneWay}"
           CommandParameter="{Binding Text,
                              ElementName=MyTextBox,
                              Mode=OneWay}"
           MustToggleIsEnabledValue="True" />
    </i:EventTrigger>
</i:Interaction.Triggers>
</Rectangle>

アップデート:

この問題には、他に 2 つの「合理的な」解決策があります。

1 つは、ここにあるレガシーの "AttachedCommandBehavior" 拡張機能と見なされているものを使用します。

もう1つは少し刺激的ですが、実行可能です.

  1. 純粋にビューでイベントを介してコマンドをキャプチャします。
  2. コントロールの DataSource ステップを照会します
  3. コマンドを示す文字列バインディング ターゲット識別子を取得します (おそらく、ビューで const 文字列を使用します)。
  4. リフレクションを介してビュー モデルでコマンドを呼び出し、コマンド引数を渡します。

これは大雑把に見えますが、実際には従来のコマンド バインディングを使用するよりも少し高速であると確信しています。確実に IL を確認する必要がありますが、この場合は問題ではないと思います。

/アップデート

ただし、これは必ずしも理想的な状況ではないことに注意してください。多くの場合、設計上の問題をカバーするために EventToCommand を使用していることに気付きました。次の点を考慮してください。

  • イベントとコード ビハインドを使用して、ユーザー インターフェイス関連の動作を処理します。
  • 特にコマンドを使用してイベント ドリブン動作をカプセル化し、ビューに反映されるバインドされたデータを設定する場合は、必要に応じてコマンド バインディングを持つカスタム コントロールを作成することを検討してください。(つまり、コントロールまたは類似のものへの近接性に基づいて透明度の値を設定します)
  • EventToCommand は、反応イベント (マウスオーバー) ではなく、「コマンドのような」イベント (ダブルクリックなど) のみを処理するために使用する必要があります。ただし、これを妨げるものは何もありません。必要に応じて実装してください。

おそらく最も重要なのは、自分が開発者であることを忘れないことです。ガイドライン自体は問題を解決しませんが、ガイドラインを考慮すると、問題の解決策が明らかになる場合があります。

于 2011-05-23T14:55:57.373 に答える
6

あなたはこの投稿を見てみたいと思うかもしれません:

WPFコマンドとイベントの長所/短所

イベントとコマンドのさまざまな使用法について説明しています。

他のイベントのコマンドに関しては、 MVVMLight Toolkitの一部としてEventToCommandのようなものを確認する必要があります。これにより、ビューモデルのコマンドに任意のイベントをアタッチできます。特に、すでにMVVM Lightを使用している場合は非常に便利です(これを強くお勧めします)。

于 2011-05-23T14:50:55.933 に答える