回答編集履歴

1

何点か意図が伝わりにくい部分があったので、表現を修正。また改行箇所を修正。

2022/03/08 08:00

投稿

ttact
ttact

スコア171

test CHANGED
@@ -14,13 +14,11 @@
14
14
  > Viewへの影響は無い(ようにするすべき)認識で合っていますか?
15
15
 
16
16
  おっしゃりたいことが
17
- 「ViewModelの内部実装が変わっても、Viewに対してBindingしている
17
+ 「ViewModelの内部実装が変わっても、Viewに対してBindingしているプロパティの仕様が変更されなければ、Viewに対する影響はない」
18
-  プロパティの仕様が変更されなければ、Viewに対する影響はない」
19
18
  ということであれば、YESです。
20
19
 
21
- 客先から表示内容や入力について要件の追加・修正がなければ、
20
+ 客先から表示内容や入力について要件の追加・修正がなければ、Viewは変更されないと思います。
22
- Viewは変更されので、ViewModelのI/F(== publicプロパティ)も
21
+ ViewModelViewのためのものなので、Viewの仕様変更がなければ、ViewModelのI/F(== publicプロパティ)も変更されないと認識しています。
23
- 変更されないと認識しています。
24
22
 
25
23
 
26
24
  (3)
@@ -29,15 +27,10 @@
29
27
  > Model部でViewModelにデータセットすることで、
30
28
  > Viewに自動反映させるイメージで大きく認識に相違無いですか?
31
29
 
32
- 「Model部でViewModelにデータセットする」という文章からは、
30
+ 「Model部でViewModelにデータセットする」という文章からは、ModelがViewModelに依存しているというふうに読めます。
33
- ModelがViewModelに依存しているというふうに読めます。
34
- 適切な参照方向は
35
- View→ViewModel→Model
31
+ 適切な参照方向は「View→ViewModel→Model」だと思います。
36
- だと思います。
37
32
 
38
- おっしゃりたいことが、INotifyPropertyChanged等で間接的に
39
- ModelからViewModelに値変更を通知伝搬することを指している
33
+ (WPFのINotifyPropertyChanged等のObserverパターン的なイベント発行等によって)Modelから通知先が誰かわからない状態で値変更を通知伝搬していて、結果的にその通知先がViewModelになってい、ということを指しているのであれば、私もその認識です。
40
- のであれば、私もその認識です。
41
34
 
42
35
 
43
36
  (4)
@@ -47,26 +40,34 @@
47
40
  > Model部で「共通データ」をViewModel1/2へセットすることで、
48
41
  > View1/2に反映させる形がオーソドックスでしょうか?
49
42
 
50
- 複数の画面から同じデータを参照するとき、それはModelに属する
43
+ 複数の画面から同じデータを参照するとき、それはModelに属するデータであると認識しています。つまり私の認識では「共通データ」はModel部に属します。
44
+
45
+ その共通データの出元ですが、VM1とVM2を両方知っている親ViewModelがいて、その親VMがDIコンテナを通じて共通データ(または共通データのファクトリ)を注入してもらい、それをVM1及びVM2に対してプロパティsetしているイメージです。
46
+ ```C#
51
- データであると認識しています。
47
+ class ParentVm
48
+ {
52
- 親ViewModelが子ViewModelを管理する際に、DIコンテナを通じて
49
+ private readonly _vm1;
53
- 解決した共通データオブジェクトを、各子ViewModelのsetプロパティを
50
+ private readonly _vm2;
51
+ public ParentVm(Func<ISharedData> dataFactory, IVm1 vm1, IVm2 vm2)
52
+ {
53
+ _vm1 = vm1;
54
+ _vm2 = vm2;
55
+ var data = dataFactory();
54
- 通じてセットしているイメージです。
56
+ _vm1.Data = data;
57
+ _vm2.Data = data;
58
+ }
59
+ }
60
+ ```
55
61
 
56
62
 
57
63
  (5)
58
64
  > ViewModelは橋渡しが主な役割の認識ですが、
59
65
  > 簡単なデータ変換であれば実装しても良いものでしょうか?
60
66
 
61
- BindingでのConverterのためにIValueConverterを実装するにあたって、
67
+ BindingでのConverterのためにIValueConverterを実装するにあたって、どのプロジェクトやパッケージに配置するのが適切か、という話でしょうか。
62
- どのプロジェクトやパッケージに配置するのが適切か、という
63
- 話でしょうか。
64
68
 
65
- 表示要件でC#コードであるなら、クラスの配置としてはViewModelの
69
+ 私は、表示要件でC#コードであるなら、クラスの配置としてはViewModelのパッケージが適切かと思っていました。
66
- パッケージが適切かと思っています。
67
70
 
68
71
  ただMVVMエキスパートの尾上様のブログ記事
69
72
  https://ugaya40.hateblo.jp/entry/model-mistake
70
- を見ると、ViewModelはできるだけ薄くする、ModelはUIを意識する、等との
73
+ を見ると、ViewModelはできるだけ薄くする、ModelはUIを意識する、等との記述がありますので、その線から考えるとModelに入れるべきなのかもしれません。
71
- 記述がありますので、その線から考えるとModelに入れるべきなのかもしれません。
72
-