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

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

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

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

.NET Framework

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

WPF

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

Q&A

解決済

3回答

6419閲覧

WPFのMVVMでViewModelでModelを丸ごと公開するのは良いことか?

silatori

総合スコア12

MVVM

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

.NET Framework

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

WPF

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

0グッド

0クリップ

投稿2018/05/23 07:00

編集2018/05/23 23:48

分からないこと

現在WPFのアプリを作成するにあたって、以下のような実装を考えています。

cs

1Model.cs 2class Model : BindableBase 3{ 4 // 通知を実装したstringのプロパティ 5 // 通知を実装したintのプロパティ 6}

cs

1ViewModel.cs 2class ViewModel 3{ 4 public ViewModel() 5 { 6 this._model = new Model(); 7 } 8 9 private Model _model; 10 11 public Model Model 12 { 13 get{return this._model;} 14 } 15}

こうすることで、ViewからModel.[Modelのプロパティ名]とすることで同期することが出来ると思います。

しかし、MVVMについて調べているとViewModelはModelのプロパティをひとつずつラップしていくような作りでないとMVVMとは言えないという旨の情報をあちこちで見かけます。それはなぜなのでしょうか?

具体的にはLivetの作者さんの資料を読みましたが(リンクは避けます)、私の理解力が足らず、このパターンが良くない理由が分かりませんでした。

ご教授願います。

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

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

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

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

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

guest

回答3

0

ViewModelはViewModelの責務としてModelのプロパティをそのまま公開するならそれはそれでOKだと思います。
その場合は、ViewModelが公開している公開名がたまたま Model.[Modelのプロパティ名] と同じなだけです。
公開名にドットが入ってるか否かの違いしかありません。
公開名自体は「共有すべき仕様」です。
もちろん ViewModel側はModelの変更に合わせて「共有すべき仕様」を更新する責務があります。

投稿2018/05/24 04:17

hihijiji

総合スコア4150

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

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

silatori

2018/05/24 12:43

ご回答ありがとうございます。 あくまでも"VMのModelプロパティ"にバインドしているから良いという考えでしょうか。 やっていることは自動プロパティのようなもので、融通は利かないがかろうじてVMの責務から外れていないと考えると納得できるような気がしました。
guest

0

ベストアンサー

シンプルに、それだと、VM と M の責務の分離ができていない
表示用に必要なものを追加できない
VMは、本当に、表示用。

C#のpublicが フィールがいいのか、プロパティがいいのか、という議論と同じように、
直接だと、モデルの変更は、どこから変更されたのかが、追うのが難しくなります。

モデルとそのまま表示するくらいの用途なら、わざわざやらなくてもいいことではありますが。

投稿2018/05/23 09:46

kiichi54321

総合スコア1984

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

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

silatori

2018/05/23 15:19

ご回答ありがとうございます。 確かに、責務の分離はできていないなと感じました。 具体的なVMの責務はVMはMを購読して値を受け取ってVに公開し、MでVMの値を使うときは引数の形で渡す。という認識で間違いないでしょうか。 確かにこれならMの更新はMしか行わないのでわかりやすいと感じました。
guest

0

ご提示されているコードでは

  • ViewModelA
  • ViewModelB
  • ModelA

とあった場合、ModelAの情報をViewModelAとViewModelBの両方が参照したい場合、ViewModelA/Bそれぞれの中でModelAのインスタンスが生成されてしまいませんか。すなわちViewModelAのModelAの情報と、ViewModelBのModelAの情報は異なってしまうように見受けられます。

プロパティをラップしないとMVVMとは言えないのソースはよくわかりませんでしたが、少なくともModelの情報を複数のViewModelで参照することが出来ないので、提示されたソースコードはよろしくないのではないでしょうか。

投稿2018/05/23 08:50

TakafumiYuasa

総合スコア124

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

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

silatori

2018/05/23 15:24

ご回答ありがとうございます。 ご指摘いただいた内容は、今回のコードでは確かにその通りです。 しかし、この問題はVMでMを生成せずにシングルトンにすることで解消するように思えます。 こうなった場合でも、VMでそのMをVに向けて丸ごと公開してもよいか、というところがわかりませんでした。 提示すべきコードが質問に適さないものであったために、うまく意図を伝えられませんでした。申し訳ございません。
TakafumiYuasa

2018/05/24 01:25

なるほどです。 丸ごと公開してよいのか?という話は、kiichi54321さんのおっしゃる通り責務の分割というところに帰結するでしょう。 また実務的な話でいうと、大規模な開発の場合はModelを開発する人とViewやViewModelを開発する人は別の人々である事が多いです。その場合、Modelのインタフェースが定まっていないとViewとViewModelが開発できない事になってしまいます。 あくまでViewはViewModelに依存し、その中だけで完結できるのが望ましいのではないかと思います。
silatori

2018/05/24 12:54

確かに、このやり方だとViewのコントロールに合うようなModelを考えることになるので分担できませんね! データ駆動の考えにも反していたことに気づきませんでした。VMはMをモデル化したものという説明もいまなら理解できます。どうやらVM-Mの関係を深く考えすぎていました。本質はV-VMなのですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問