2012-03-10 10 views
0

VMを採用する際の制限はどこにあるのですか。例:MVVMのVMの役割 - すべてを処理する必要があるのはなぜですか?

新しい項目の追加を許可するUI(exボタン)コマンドが必要です。追加の要件は、新しい項目を選択し、コントロール上に表示されていることを確認し(ツリービューコントロールと言う)、新しく追加された項目の編集を開始することです(VMで設定された定義済みの値を変更する必要があります)。これを達成するための自動メカニズムがコントロールにないと仮定して、手動で行う必要があります。したがって、実行フローは次のようになります。

  1. VM上でaddコマンドを実行しました - 完了はViewのxamlです。
  2. コントロールのSelectedItemプロパティをVMのCurrentItemプロパティにバインドし、新しいアイテムをCurrentItemに割り当てます。
  3. 新しいアイテムがコントロール上に表示されていることを確認します。これはViewのコードの背後で行う必要があります。
  4. スタート編集 - これは背後にあるビューのコードで行われなければならない今

、どこでもネット上のほとんどすべてのメッセージを使用しての記事、疑問があるので:。

私ならば、私は何を壊すかは、単純な古い方法でそれをやる方法?私は新しいアイテムを追加する際にCommandバインディングの代わりにClickイベントを使用し、このメソッドでは私はこれを行います:

// in View's Click event handler 
ViewModel.AddCommand.Execute(null); 
EnsureVisibleSelectedItem(); 
BeginEdit(); 

清潔でクリアな!

// in ViewModel's AddCommand 
AddNewItem(); 
SetCurrentItem(); 
SendMessageToEnsureVisibleSelectedItem(); 
SendMessageToBeginEditSelectedItem(); 

...ここで、Viewはこれらの2つのメッセージを受信するように登録されています。

これに関するいかなる光も大歓迎です。私の意見では、UIは変わる可能性があり、VMはそれ自体に変更を加えずに新しいUIを採用できるはずなので、インターネット上で宣伝されている現在のMVVMポリシーを理解できません。

答えて

3

私は「簡単にする」と言います。何

本当に重要MVVMでは次のとおりです。ViewModelにに行くべきビューに依存しないものを

  • は(あなたのViewModelは、どのような方法でビューを意識してはならない - だけではなく、オブジェクト参照によって)
  • ビューのすべてとそのコードビハインド

はい、コード末尾にのがあります。コードビハインドがロジックにではなくビューに関連するコードであれば、コードビハインドを書くのに間違いはありません。たとえば、ドラッグの&のドロップ管理は、コードビハインドで記述する必要があります。

あなたの質問に答えるために、あなたは書面で何かを壊さない:

// in View's Click event handler 
ViewModel.AddCommand.Execute(null); 
EnsureVisibleSelectedItem(); 
BeginEdit(); 

ビューに関連していないすべてはViewModelに、表示/コードビハインドで他のすべてです。それだけです。

ありません私はあなたの第二の例を見れば:

// in ViewModel's AddCommand 
AddNewItem(); 
SetCurrentItem(); 
SendMessageToEnsureVisibleSelectedItem(); 
SendMessageToBeginEditSelectedItem(); 

AddNewItemSetCurrentItemが(ビューとは関係ありません)OKですが、何SendMessageToEnsureVisibleSelectedItemSendMessageToBeginEditSelectedItemについて、(ビューとは関係ありません)OKですか? EnsureVisibleは、通常、ツリービューには便利ですが、ビューがツリービューで構築されていない場合はどうなりますか?コントロールが自動的に新しい選択項目を表示させるようにするとどうなりますか?もちろん、あなたはメッセージを無視することができますが、ViewModelにはUI表示にビューが必要と思われるので、無用なコードを書いていたでしょう。

ViewModelには、通常、Viewがどのように動作するかを認識しているコードが記述されています。 はい、コードビハインドの行数を減らしましたが、パターンが壊れています。

あなたの「古いファッションウェイ」は、実際にあなたのニーズに適した方法です。あなたのViewModelはビューを認識しません。それは重要なことです。

+0

+1: "コードビハインドではありません。ビューに関連するコードであればコードビハインドを書いても問題はありません" – Uri

+0

コメントありがとうございました。新しい「ヘルパー」が別の方向に向いているように見えます。たとえば、event2コマンドを見ると、VMはUIに依存しませんか?つまり、Windows Phone APIには存在しない、silverlightの特定の引数を持つイベントが存在する可能性があります。このようにして、VMを特定のプラットフォームに依存させるようにします。 – Goran

+0

@Goran 'EventToCommand'は、イベントをコマンドに「変換する」ために、XAML(VMではなく)で使用されます。あなたのViewModelはXAMLの_any_イベントにバインドされた( "EventToCommand'のおかげで)"標準 "の' ICommand'プロパティを公開します。 VMはUIを実際に認識していません。しかし、私は正直言ってそれが本当に好きではありません。それはしばしば事を過度に複雑にします。私は通常のイベントハンドラを好んでおり、コードビハインドでは 'this.MyViewModel.MyCommand.Execute(...)'を好む。シンプルでわかりやすく、UIコード(つまり、UIを説明するXAMLコード)を無意味にすることはありません。 – ken2k

関連する問題