質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.62%

【WPF】【MVVM】XAML①上の変更や操作をXAML②で検知したい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 825

galmacher

score 37

MainWindowをFrameで二つに分割し、それぞれ別のXAML(Page1.xamlとPage2.xaml)を配置しようとしています。
Page1にはButtonを配置し、Page2にはTextBlockを配置します。
Buttonが押されたらTextBlockに文字を表示したいです。

自分のイメージでは、
Page1ViewModelとPage2ViewModelが共通のModelクラスのインスタンスを見ており、
Buttonが押されたらPage1ViewModelがModelを更新?して、
Page2ViewModelは更新されているかを常にチェックして、チェックされていればViewに反映するのかなと思っています。

【聞きたいこと】
①:MVVMの考え的に、上の理解で合っておりますか。
また、上記のButtonとTextBlockの例はものすごくシンプルですが、もっと複雑になったとしても基本的にこの考えで良いのでしょうか。
(良い例が浮かびませんが、たとえばPage2がさらにフレームで別れていて、中にまたXAMLが複数あったり…。)

②:①の考えが合っていたとしても概念的な理解でしかなく、具体的にどういう技術(クラスやプロパティ)を使えばいいのか、
何というワードで検索すれば良いのか分からないためご教示頂けると幸いです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

常にチェックと言うか、ViewModel はプロパティが変更された時にイベントを発行します。
そのイベントを購読すれば変更が通知されます。
この例の場合は、Button を押すことによってテキストを保持する ViewModel のプロパティが変更され、ViewModel は PropertyChanged イベントを発行し、View はそのイベントを受け取ってどのプロパティがどのように変更されたのかを知り、バインドされた適切な要素を更新します。

同じ ViewModel に二つの View をバインドすればいいのではないかと思いますが、そうでない場合は 二つの ViewModel から同じモデルを参照することになります。
この場合、Model がプロパティ変更イベントを発行できるのであれば、Model をプロパティとして公開し、View を直接バインドすることもできます。
そうでなければ、ViewModel のプロパティを通じて Model のプロパティにアクセスできるようにし、View は ViewModel のプロパティにバインドします。

INotifyPropertyChanged を調べてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/29 21:52

    ウィンドウが一つなので一つのビューと言えますし、どんな場合も一対一にしなければならない合理的な理由はありません。
    ボタンを二つ並べて一つ一つにビューモーデルを用意するのはナンセンスです。

    デザインパターンは法律ではなく保守性を高めるツールですから、細部にこだわるあまり根幹を見失わないようにしましょう。

    キャンセル

  • 2018/10/29 22:01

    ネット上では、コードビハインドには何も書いてはいけないとか、ビューはモデルをバインドしてはいけないという迷信がはびこり、それを回避するためにものすごく複雑な処理を強いる情報があふれています。

    そのような処理の流れが一目でわからないコードのことをスパゲッティと呼び、そのようなコードを書くことをスパゲッティをゆでると言います。

    生産性を高めるはずの MVVM で生産性が低くなったのでは本末転倒です。
    コードビハインドが肥大化してスパゲッティになるのを防ぐはずのデータバインディングでスパゲッティをゆでるなどなんと滑稽なことでしょう。

    プログラマーのすべきことは、MVVM とはなんぞやという哲学を追い求めることではなく、少しでもテストを書きやすく美しいコードを書くことだと思います。

    キャンセル

  • 2018/10/29 22:14

    ご回答ありがとうございます。
    確かにおっしゃる通り、「目的と手段が逆転」の典型的な例な気がします。
    まだ勉強し始めで、どこからどこまでをMVVMのデザインパターンに沿うかはまだ手探りですが、肝に銘じてまいります。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る