こんにちは、最近 WPF を調べて、イベントとコマンドについて学び始めました。私は通常、「ビューモデル」でメソッドを実行させるボタンクリックでコマンドを使用します。
コマンドを使用して、ボタンを MouseOver イベントなどの他のイベントに反応させることは可能ですか? または、この場合は WPF イベントを使用しますか?
WPF イベントを使用する場合、イベント ハンドラーの実装はビュー モデル内のメソッドを呼び出すだけで問題が発生しないようにする必要がありますか?
こんにちは、最近 WPF を調べて、イベントとコマンドについて学び始めました。私は通常、「ビューモデル」でメソッドを実行させるボタンクリックでコマンドを使用します。
コマンドを使用して、ボタンを MouseOver イベントなどの他のイベントに反応させることは可能ですか? または、この場合は WPF イベントを使用しますか?
WPF イベントを使用する場合、イベント ハンドラーの実装はビュー モデル内のメソッドを呼び出すだけで問題が発生しないようにする必要がありますか?
これは公正な質問であり、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つは少し刺激的ですが、実行可能です.
これは大雑把に見えますが、実際には従来のコマンド バインディングを使用するよりも少し高速であると確信しています。確実に IL を確認する必要がありますが、この場合は問題ではないと思います。
/アップデート
ただし、これは必ずしも理想的な状況ではないことに注意してください。多くの場合、設計上の問題をカバーするために EventToCommand を使用していることに気付きました。次の点を考慮してください。
おそらく最も重要なのは、自分が開発者であることを忘れないことです。ガイドライン自体は問題を解決しませんが、ガイドラインを考慮すると、問題の解決策が明らかになる場合があります。
あなたはこの投稿を見てみたいと思うかもしれません:
イベントとコマンドのさまざまな使用法について説明しています。
他のイベントのコマンドに関しては、 MVVMLight Toolkitの一部としてEventToCommandのようなものを確認する必要があります。これにより、ビューモデルのコマンドに任意のイベントをアタッチできます。特に、すでにMVVM Lightを使用している場合は非常に便利です(これを強くお勧めします)。