2009-06-21 10 views
6

ViewModelによって公開されているRelayCommandというMVVMのアイデアが好きです。それ以上のユーザー入力なしで実行できる操作のために、それは素晴らしく洗練されています。シンプル。テスト可能。MVVMとより多くのGUIを表示するコマンド

ただし、すべての操作がUIレスではありません。確認が必要なものがあります( "本当に削除しますか?")。その他の情報は、まだ多くの情報が必要です。ファイルを開くと、[ファイルを開く]ダイアログから完全なインポートウィザードまでの間に何かが発生する可能性があります。

MVVMアプリケーション内で、ユーザーの入力が必要なコマンドを書き込むには、どのような方法が最適ですか?何らかの形で依存性注入でこれを解決するための確立されたパターンがありますか?コードビハインドにKeyDownハンドラを記述し、明示的にイベントを実行する必要がありますか?私はRoutedUICommandに戻って、すべての "次のGUIを表示する"コードを私のビューに置くべきですか?または、私が完全に欠けていることが明らかな何かがありますか?

答えて

4

私は通常、ある種の抽象的なIShowTheInterfaceを挿入し、Command内から抽象メソッドを呼び出すためにDependency Injectionを使用します。これらのメソッドは、アクションを続行するかどうか、ユーザーが入力した内容を判断するために必要な答えを示します。

私は最近、blog post with a bit of a different topicの例としてこれを使用しました。

1

この種のもの(確認ダイアログ、ファイルオープンダイアログなど)は通常、アプリケーション間で共有されます。だから私の好みはViewModelにまったく入れていない。

ViewModelはアプリ固有のため、ViewModelBaseを無期限に拡張することはおすすめできません。代わりに、再利用可能なビヘイビアを作成してビューを拡張します。

ビヘイビアの性質を持つことができますし、行動特性を指定するだけでなく、これらのプロパティを使用することができますが、また、いくつかのフィードバックを得るために:

<Button Content="Open Document"> 
    <i:Interaction.Behaviors> 
     <local:FileOpenBehavior 
      FileNameTarget="{Binding ElementName=tbDocName}"/> 
    </i:Interaction.Behaviors> 
</Button> 
Expression Blend Gallery

EDITで数動作サンプルがqueteあります。

上記の例では、tbDocNameを非表示にすることも、ModelViewのプロパティにバインドすることもできます。

+0

「表示するダイアログを表示」の部分は再利用可能です。しかし、あなたはそのファイルで何かをする必要があります、そして、それはアプリケーション特有になるでしょう、従って、私はこれがどのように動作するか確かではありません。あなたは行動でこれをどうやって行うのかの例を挙げられますか? –

+0

@ joe-whiteキャッチしてViewModelに中継するUIスタックの上にルーティングされたメッセージを送信します。または、ViewModelのプロパティにバインドすると、プロパティが変更されたときにファイルが割り当てられることがわかります。 –

関連する問題