none
【WPF-MVVM開発】 xamlファイルを分けた場合のOnPropertyChanged通知方法 RRS feed

  • 質問

  • 以下、”どうやる方法がスマートなのか”をお尋ねいたします。

    □プログラム概要(WPF+MVVMパターン)

    MainWindow.xamlを作成し中に適当なタブコントロールを作成する。

    タブの1ページに別xamlファイルを定義し、Frame.Sourceにてバインディング。

    (プログラムを起動させるとちゃんとタブのページ内容は表示される)

    ここであるタブの中のComboBoxがOnPropertyChangedを発生させた場合に、

    MainWindowへはどのように”通知”するのが良いのでしょうか?

    □私のやり方

    MainWindow.xaml のビューモデルをMainWindowViewModelとする。

    タブページ用にTabPage.xamlを作成し、ビューモデルをTabPageViewModelとする。(INotifyPropertyChangedベース)

    TabPage.xamlにはComboBoxを定義。

    MainWindow.xamlにタブコントロールとタブページ1つを定義し、

    TabPage.xamlをFrame.Sourceでバインディング。

    一方、タブページ内のCombBoxのValueとTabPageViewModelのプロパティをバインディング。

    ここでValueが変更された場合のPropertyChangedはTabPage.xamlまで届くのですが、

    TabPage.xamlとMainWindowl.xamlには通知の関係がないため、

    MainWindow内のFrame.LoadCompletedイベント内で((TabPage)(Frameインスタンス名.Content).PropertyChaned += イベント...

    としてMainWindowクラスまで通知が届くようにしている。(どうもかっこ悪い)

    さて、どうするのがスマートなのでしょうか?

     

    2011年2月17日 10:47

回答

  • TabPageViewModelがイベントで、MainWindowViewModelに通知するのが妥当でしょうね。

    MainWindowViewModelが、TabPageViewModelのイベントを購読していればよいだけだと思います。

    この実装が一番自然で、他のあらゆる実装は不自然だと思います。

    • 回答としてマーク 山本春海 2011年3月1日 7:34
    2011年2月17日 16:38
  • この場合は、MainWindow.xaml と TabPage.xaml は親子関係にあります。

    MainWindowViewModel と TabPageViewModel は親子関係にないのですか?
    あるとしたらいくらでも親子でやり取りする方法があります。
    イベントでもデリゲートでもメソッド呼び出しでも可能です。

    ないとしたら TabPageViewModel の生成と消滅の責任を持っている場所がないことになります。
    この場合はいいかもしれませんがメモリーリークの要因です。



    えムナウ@わんくま同盟 Microsoft MVP Visual Studio C# Since 2005/01-2010/12
    • 回答としてマーク 山本春海 2011年3月1日 7:34
    2011年2月18日 14:39

すべての返信

  • TabPageViewModelがイベントで、MainWindowViewModelに通知するのが妥当でしょうね。

    MainWindowViewModelが、TabPageViewModelのイベントを購読していればよいだけだと思います。

    この実装が一番自然で、他のあらゆる実装は不自然だと思います。

    • 回答としてマーク 山本春海 2011年3月1日 7:34
    2011年2月17日 16:38
  • 返信ありがとうございます。

    そうですね、ViewModel同士がやり取りするのが自然ですね。

    (小生はMVVMパターンにまだ慣れていませんので、そういった発想にすぐにはなりません。。)

     

     

    2011年2月18日 5:56
  • この場合は、MainWindow.xaml と TabPage.xaml は親子関係にあります。

    MainWindowViewModel と TabPageViewModel は親子関係にないのですか?
    あるとしたらいくらでも親子でやり取りする方法があります。
    イベントでもデリゲートでもメソッド呼び出しでも可能です。

    ないとしたら TabPageViewModel の生成と消滅の責任を持っている場所がないことになります。
    この場合はいいかもしれませんがメモリーリークの要因です。



    えムナウ@わんくま同盟 Microsoft MVP Visual Studio C# Since 2005/01-2010/12
    • 回答としてマーク 山本春海 2011年3月1日 7:34
    2011年2月18日 14:39