VMを採用する際の制限はどこにあるのですか。例:MVVMのVMの役割 - すべてを処理する必要があるのはなぜですか?
新しい項目の追加を許可するUI(exボタン)コマンドが必要です。追加の要件は、新しい項目を選択し、コントロール上に表示されていることを確認し(ツリービューコントロールと言う)、新しく追加された項目の編集を開始することです(VMで設定された定義済みの値を変更する必要があります)。これを達成するための自動メカニズムがコントロールにないと仮定して、手動で行う必要があります。したがって、実行フローは次のようになります。
- VM上でaddコマンドを実行しました - 完了はViewのxamlです。
- コントロールのSelectedItemプロパティをVMのCurrentItemプロパティにバインドし、新しいアイテムをCurrentItemに割り当てます。
- 新しいアイテムがコントロール上に表示されていることを確認します。これはViewのコードの背後で行う必要があります。
- スタート編集 - これは背後にあるビューのコードで行われなければならない今
、どこでもネット上のほとんどすべてのメッセージを使用しての記事、疑問があるので:。
私ならば、私は何を壊すかは、単純な古い方法でそれをやる方法?私は新しいアイテムを追加する際に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ポリシーを理解できません。
+1: "コードビハインドではありません。ビューに関連するコードであればコードビハインドを書いても問題はありません" – Uri
コメントありがとうございました。新しい「ヘルパー」が別の方向に向いているように見えます。たとえば、event2コマンドを見ると、VMはUIに依存しませんか?つまり、Windows Phone APIには存在しない、silverlightの特定の引数を持つイベントが存在する可能性があります。このようにして、VMを特定のプラットフォームに依存させるようにします。 – Goran
@Goran 'EventToCommand'は、イベントをコマンドに「変換する」ために、XAML(VMではなく)で使用されます。あなたのViewModelはXAMLの_any_イベントにバインドされた( "EventToCommand'のおかげで)"標準 "の' ICommand'プロパティを公開します。 VMはUIを実際に認識していません。しかし、私は正直言ってそれが本当に好きではありません。それはしばしば事を過度に複雑にします。私は通常のイベントハンドラを好んでおり、コードビハインドでは 'this.MyViewModel.MyCommand.Execute(...)'を好む。シンプルでわかりやすく、UIコード(つまり、UIを説明するXAMLコード)を無意味にすることはありません。 – ken2k