10

Silverlight コミュニティでは、XAML のコード ビハインド ファイルを可能な限りコードから解放するために多くの努力が払われています。この背後にある本当の動機は何ですか?

たとえば、イベント ハンドラの代わりにコマンドを使用する利点は何ですか? 私が持っている場合

<Button x:Name="SaveButton" Content="Save" Click="SaveButton_Click" />

...

private void SaveButton_Click(object sender, RoutedEventArgs e) {
    _myViewModel.SaveChanges();
}

では、なぜこれが好まれるのでしょうか。

<Button x:Name="SaveButton" Content="Save" Command="{Binding SaveCommand}" />

明らかSaveCommandに私のビューモデルの が効果的に呼び出す場所SaveChanges()

これにより、ビューが 100% XAML であり、ビュー モデルが XAML でインスタンス化されていて、ビューとビュー モデル間の接続がバインディングによって完全に行われている状況が発生する可能性があります。確かにそれはきれいですが、それ以外は何ですか?フレキシブル?なんで?ビューは引き続き適切な ViewModel で動作する必要があるため、2 つの間の接続が存在し、暗黙的である場合は、それをより明示的にしないでください。また、コンパイル時のサポートが失われるという欠点もあります。存在しないイベント ハンドラにボタンを接続すると、コンパイラが教えてくれます。存在しないコマンドにバインドすると、そうはなりません。

4

4 に答える 4

5

Silverlight コミュニティでは、XAML のコード ビハインド ファイルを可能な限りコードから解放するために多くの努力が払われています。この背後にある本当の動機は何ですか?

コードビハインドを「できる限りコードから解放したい」と思っている人は、要点を理解せずに MVVM の流行に飛び乗った人だと思います。(それか、あなたが彼らの主張を誤解したかのどちらかです)。

重要なのは、コード ビハインドをコードから解放することではなく、View が視覚的な表示のみを担当するようにすることです。多くの視覚的側面を宣言的に定義できるということは、コード ビハインドのコードが少なくなることを意味します。

イベント ハンドラの代わりにコマンドを使用する利点は何ですか?

Command は、イベント ハンドラーにはない機能を少なくとも 2 つ提供します。一部の WPF コントロールは Command の CanExecute プロパティを認識するため、たとえば、コマンドを実行できない場合にボタンを無効にすることができます。また、デザイナーとバインディング フレームワークはコマンドを認識します。

ボタンを押してメソッドを呼び出したいだけの場合は、イベント ハンドラーからメソッドを呼び出す代わりにコマンドを使用しても大きな利点はありません。したがって、このアプローチを使用することを恐れないでください。(プログラマーよりもデザイナーに有利な 3 つ目のアプローチは、Blend 4 の CallMethodAction を使用することです)。

于 2010-07-31T06:37:58.730 に答える
3

これにより、単体テストや TDD が容易になります。MVVM とコマンドを使用することで、基本的にビュー モデルとコマンドを TDD スタイルで構築し、実際に XAML ビューをまったく使用しなくても、ほとんどのビュー ロジックをテストできます。

于 2010-07-27T15:42:16.507 に答える
1

あなたがそれについて聞くかもしれない多くの議論があるかもしれませんが、実際的には唯一のテスト可能性があります。ViewModelは、単体テストを作成しない限りほとんど提供されません。つまり、依存性注入、IoC、何とか、何とかなどの手法を使用して、単体テストができるようにViewModelを作成する必要があります。 、など。

その結果、単体テストでは、UIコードをより統合した場合に達成できるよりも、アプリケーションコードの大部分をカバーできます。

私は必ずしもそれをお勧めしているわけではありません。それを適切に行うには、かなりの設計努力と先見の明が必要です。したがって、このようなアプローチを構築するためのコストは非常に高くなりますが、品質の向上による節約によって、これらのコストが十分に相殺される可能性があります。

于 2010-07-27T15:48:03.607 に答える
1

このコマンドの主な利点は、アクションを実行することと、アクションを実行できること (コンテキスト)を検証するという 2 つの要件がある場合です。言い換えれば、単純にクリックを単純なメソッド呼び出しにリンクしている場合、同意します。利点もありません。ただし、クリックを条件付けする必要があり、コンテキストに基づいてボタンを無効にする必要がある場合、バインディングは CanExecute プロパティを介してこれを容易にします。

このように、ビュー内のコントロールについて心配する必要はありません (つまり、「このコントロールを見つけて、現在実行できないため無効に設定する」というロジックを使用する必要はありません)、コマンドを作成して、それが確実に実行できるようにすることができます。 execute returns false. これは、ビューとは無関係にテスト可能であり、一度バインドすると、バインディング自体がコントロールの有効なプロパティを管理します。

于 2010-07-27T16:42:28.133 に答える