none
MVVMの画面遷移について RRS feed

  • 質問

  • WPFのMVVMパターンにてアプリを作成しています。

    理解不足な為、妙な質問化もしれませんが、何卒よろしくお願い致します。

     

    担当者マスタメンテナンスの処理を実装しています。

    A:担当者一覧画面

    B:担当者修正画面

    とした場合、

    Aで選択したレコードのみBの画面で表示したいのですが、やり方がわかりません。

     

    AでバインドさせているプロパティはViewModelのListになります。

    なので、選択したレコードのViewModelだけをB画面に渡し、それをバインドさせたいです。

     

    あと、バインドの方法ですがXAMLから行っています。

    この方法だと、Window.DataContextに指定したViewModelをバインドでき、

    子要素もプロパティ画面からマウスで選択できます。(コードからのバインドだとこれが出来なくなると思っています。)

     

    そもそも、考え方が間違っていないか?が正直不安に感じております。

     

    どなたか、ご教授頂けますでしょうか?

    2011年2月7日 13:47

回答

  • 普通にA画面のViewModelで選択されている行のデータを含むViewModelを作成して、そいつをDataContextに入れてWindow新たなWindowを表示すればいいと思います。

    ただ、ViewModelでWindowのインスタンスを作ってShowするのではなくて、以下のスライドで述べられてるようにMessenger and Behaviorで実現する方法がスマートでいいと思います。

    http://ugaya40.net/wpf/mvvm-study-resource.html


    かずき Blog:http://d.hatena.ne.jp/okazuki/
    2011年2月7日 14:45
  • MVVM的には、ViewModelは特定のViewの実装方法に極力依存するべきではありません。

    つまり、ViewModelでWindowをインスタン化してShowしたりはしません。

    ただこの場合、Messenger and Behaviorは必要ないです。

     

    わざわざViewModelを介さずとも、A画面で選択したViewModelをバインドできて、新しいWindowの型を指定可能なビヘイビアがあればよいだけです。

    で、ビヘイビアの中でWindow(この場合はB画面)をインスタンス化して、DataContextにプロパティで指定されたViewModel(この場合はA画面で選択されたB画面のViewModel)をセットします。

     

    XAMLでDataContextを指定しても、コードでDataContextを設定しても動作はなんら変わりません。もっと汎用的にすることもできますが、ご自身でMVVMインフラを構築する気がないのであればビヘイビア化が妥当です。

    • 回答としてマーク すねお 2011年3月1日 12:20
    2011年2月17日 16:48
  • とりあえずPrismで提供されてるクラスを使って作ってみました。

    http://d.hatena.ne.jp/okazuki/20110227/1298774665


    かずき Blog:http://d.hatena.ne.jp/okazuki/ VS 2010のデザイナでBlendのBehaviorをサポートするツール公開してます。 http://vsbehaviorsupport.codeplex.com/
    • 回答としてマーク すねお 2011年3月1日 12:20
    2011年2月27日 2:44

すべての返信

  • 普通にA画面のViewModelで選択されている行のデータを含むViewModelを作成して、そいつをDataContextに入れてWindow新たなWindowを表示すればいいと思います。

    ただ、ViewModelでWindowのインスタンスを作ってShowするのではなくて、以下のスライドで述べられてるようにMessenger and Behaviorで実現する方法がスマートでいいと思います。

    http://ugaya40.net/wpf/mvvm-study-resource.html


    かずき Blog:http://d.hatena.ne.jp/okazuki/
    2011年2月7日 14:45
  • すみません、もう少し教えてください。

     

    Messenger and Behaviorでどう実現するのか?です。

    ViewModelでWindowのインスタンスを作ってShowするのではなくて、BehaviorにてWindowのインスタンスを作ってShowするという解釈であっていますでしょうか?

    表現がおかしいかもしれませんが、Windowのインスタンスを作ってShowするという場所をViewModelにさせずに、Behaviorで処理するというMVVMの思想的にスマートである

    という考えでしょうか?

     

    あとバインドについてですが、B画面にて使用するViewModelは、インスタンス化のタイミングでDataContextにセットする方法(コードからのバインド)であり、

    XAMLからのバインドはできないのでしょうか?

     

    極論を言えば、A画面で使用しているViewModelを、B画面でのXAMLから指定できればうれしいのですが。。

     

    2011年2月8日 2:16
  • MVVM的には、ViewModelは特定のViewの実装方法に極力依存するべきではありません。

    つまり、ViewModelでWindowをインスタン化してShowしたりはしません。

    ただこの場合、Messenger and Behaviorは必要ないです。

     

    わざわざViewModelを介さずとも、A画面で選択したViewModelをバインドできて、新しいWindowの型を指定可能なビヘイビアがあればよいだけです。

    で、ビヘイビアの中でWindow(この場合はB画面)をインスタンス化して、DataContextにプロパティで指定されたViewModel(この場合はA画面で選択されたB画面のViewModel)をセットします。

     

    XAMLでDataContextを指定しても、コードでDataContextを設定しても動作はなんら変わりません。もっと汎用的にすることもできますが、ご自身でMVVMインフラを構築する気がないのであればビヘイビア化が妥当です。

    • 回答としてマーク すねお 2011年3月1日 12:20
    2011年2月17日 16:48
  • とりあえずPrismで提供されてるクラスを使って作ってみました。

    http://d.hatena.ne.jp/okazuki/20110227/1298774665


    かずき Blog:http://d.hatena.ne.jp/okazuki/ VS 2010のデザイナでBlendのBehaviorをサポートするツール公開してます。 http://vsbehaviorsupport.codeplex.com/
    • 回答としてマーク すねお 2011年3月1日 12:20
    2011年2月27日 2:44
  • ありがとうございます。

    重ね重ね申し訳ないのですが、

    画面Bにて更新ボタンを押した時だけ、画面Aに反映したいです。

    サンプルでは参照渡しの為、自動的に反映されてしまいます。

    どこかでB画面だけのViewModelを作成する必要があるとは思いますが、

    どこに実装すべきか?どう記述すればスマートか?で悩んでおります。

     

    ご教授頂けますでしょうか?

    2011年3月1日 12:25
  • IEditableObjectインターフェースを実装してしまうのが正攻法ですかね~。ただし、ちょっとめんどくさいと思います。(Googleで検索すれば汎用的なIEditableObjectの実装例出てくるかもしれません)
    あとは、自前で泥臭く何かしら仕組みを作るくらいだと思います。
    かずき Blog:http://d.hatena.ne.jp/okazuki/ VS 2010のデザイナでBlendのBehaviorをサポートするツール公開してます。 http://vsbehaviorsupport.codeplex.com/
    2011年3月2日 15:18