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

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

新規登録して質問してみよう
ただいま回答率
85.48%
MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

369閲覧

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

galmacher

総合スコア37

MVVM

MVVM(Model View ViewModel)は構築上のデザインパターンで、表現ロジック(ViewModel)によってデータ(Model)からページ(View)を分離させます。

XAML

XAML(Extensible Application Markup Language)はWPF、Silverlight、Windows PhoneそしてWindows Store appsでユーザーインターフェースを定義するために使われるXML言語です。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2018/10/27 18:08

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が複数あったり…。)

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

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

INotifyPropertyChanged を調べてください。

投稿2018/10/27 23:37

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2018/10/28 01:17

この低評価はストーカーの仕業なので気にしないでください。
galmacher

2018/10/29 12:37

ご回答ありがとうございます。ストーカー大変ですね…。 お蔭さまでViewModelのPropertyChangedイベント発行からの流れは(概念的なところは)理解できました。 >同じ ViewModel に二つの View をバインドすればいいのではないかと思いますが ■→「ViewとViewModelは1対1」という図を色々なところで見たせいか、そもそも出来ない(というかやってはいけない)ものなのかと思いました。漠然とした質問ですが、VとVMが1:多となることは、実態としてはよくある話なのでしょうか? >そうでない場合は 二つの ViewModel から同じモデルを参照することになります。 ■→ご回答いただいて色々と調べたのですがVMとMの関係性がよくわからず、ご回答内容の理解までにかなり勉強が必要そうです…。
Zuishin

2018/10/29 12:52

ウィンドウが一つなので一つのビューと言えますし、どんな場合も一対一にしなければならない合理的な理由はありません。 ボタンを二つ並べて一つ一つにビューモーデルを用意するのはナンセンスです。 デザインパターンは法律ではなく保守性を高めるツールですから、細部にこだわるあまり根幹を見失わないようにしましょう。
Zuishin

2018/10/29 13:01

ネット上では、コードビハインドには何も書いてはいけないとか、ビューはモデルをバインドしてはいけないという迷信がはびこり、それを回避するためにものすごく複雑な処理を強いる情報があふれています。 そのような処理の流れが一目でわからないコードのことをスパゲッティと呼び、そのようなコードを書くことをスパゲッティをゆでると言います。 生産性を高めるはずの MVVM で生産性が低くなったのでは本末転倒です。 コードビハインドが肥大化してスパゲッティになるのを防ぐはずのデータバインディングでスパゲッティをゆでるなどなんと滑稽なことでしょう。 プログラマーのすべきことは、MVVM とはなんぞやという哲学を追い求めることではなく、少しでもテストを書きやすく美しいコードを書くことだと思います。
galmacher

2018/10/29 13:14

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問