2011-07-05 6 views
8

アプリケーションでMVVMでコマンドを使用し始めたところです。私はいくつかの例を見つけ、自分のコードで両方の方法で試しました。 OpenRecentFile_ExecutedはViewModelに方法及びそのような静的なのICommandされた状態でXAMLでのコマンドバインディングとViewModelでのICommandプロパティの比較

<CommandBinding Command="local:MainWindow.OpenRecentFile" 
       Executed="{Binding OpenRecentFile_Executed}" /> 
... 
<MenuItem Header="{x:Static culture:TextResource.RecentFilesMenuItem}" 
      Command="local:MainWindow.RecentFilesCommand" > 

:いくつかの例はそうのようなXAMLでバインディングのコマンドを持って

public static readonly ICommand OpenRecentFile = 
    new RoutedCommand("Open Recent", typeof(MainWindow)); 

プロパティがある場合、私も見てきましたそのようなビューにバインドされているタイプのICommandであるのViewModel上:

<MenuItem Header="Close Current File" 
      Command="{Binding CloseCurrentFileCommand}" 
      CommandParameter="{TemplateBinding DataContext}"/> 

とのViewModelで:

private ICommand closeCurrentFileCommand; 
public ICommand CloseCurrentFileCommand 
{ 
    get 
    { 
     if (closeCurrentFileCommand == null) 
     { 
      closeCurrentFileCommand = 
       new RelayCommand(param => this.CloseCurrentCedarFile(param)); 
     } 
     return closeCurrentFileCommand; 
    } 
} 

各方法の利点/欠点は何ですか?

答えて

7

あなたのデザインによって異なります。クイックアプローチの場合は、バックエンドコードのあるウィンドウでXAMLでコマンドを宣言すると、おそらく時間を節約し、長期的には労力を軽減できます。

MVVMアプリケーションを使用する場合は、一般的にはコマンド(開く/保存/編集)を操作する方法としてViewModelで定義する必要があるため、ICommandへのバインドを強くお勧めします。おそらくもっと多くの努力は機能に依存しますが、MVVMは大規模なアプリケーションを実行する場合には最適な方法です。

最終的にはどちらも同じように動作しますが、デザインとアプローチは重要です。

5

私はこれらの主な違いはの最初のバージョンの性質だと思います。ルーティングの面では、いくつかのシナリオではコマンドをより強力にすることができますが、さらに苦痛を与えることもあります。コマンドを実行しようとすると痛みが出ますが、ターゲットUI要素にはフォーカスがありません。

コマンド呼び出しとコマンド配信の間に「ルーティング」ステップがないため、プロパティベースのICommand実装は常に機能します。

シナリオでルーティングが提供する機能を呼び出さない限り、ほとんどの場合、プロパティベースのコマンドを使用する傾向があります。