WPF(.NET, WinUI) GUIプログラミング Part26

■ このスレッドは過去ログ倉庫に格納されています
2021/06/20(日) 17:04:18.66ID:7UVkl7BZ
Windows Presentation Frameworkについて語るスレ。

前スレ
WPF(.NET4.x, .NET Core) GUIプログラミング Part25
https://mevius.5ch.net/test/read.cgi/tech/1612522463

関連スレ
Windows 10 UWPアプリ開発 Part 2
http://mevius.2ch.net/test/read.cgi/tech/1499658092/

コードを貼る場合は以下のサイトの利用をお勧め。
run codeのチェックは外しておきましょう。
http://ideone.com/
389デフォルトの名無しさん
垢版 |
2021/07/07(水) 19:54:05.96ID:aJu+QZ75
>>376みたいな人間がUXを語るべきじゃないな
感性も腐ってそう
2021/07/07(水) 20:56:03.54ID:85qcEXGX
開発者のエゴイズム丸出しでいかにもWPF好きらしくていいじゃん
2021/07/07(水) 21:01:06.97ID:opTZ3hwS
WPFって見た目がカラフルでもUIデザインの基本的なプロトコルはクラシックなWinアプリのままなんで、
画面遷移とか作り込んで完全にWebやスマホ風にしてしまうのでもない限りは即時反映はかえって混乱を招くと思う
392デフォルトの名無しさん
垢版 |
2021/07/07(水) 21:03:20.07ID:aJu+QZ75
彼はむしろWPFアンチだよ
冗長くんだもん
2021/07/07(水) 22:28:03.79ID:SoF9c5HC
>>388
バインディングの都合を満たすのはVMの仕事で、Mの独立を保つ為に犠牲になる係でしょ?
2021/07/07(水) 23:12:07.60ID:1XrHuH3i
しかし、Modelの一部をINotifyPropertyChangedやReactivePropertyに変えるなど
規模にもよるが小一時間の仕事だろうに

使いたくない理由を無理やり探しているんだろうね
2021/07/07(水) 23:14:24.01ID:O/p4KsNN
INotifyPropertyChangedなんてWinFormでも使うだろうに
何のためのモデルクラスだったんだろう
2021/07/08(木) 07:47:22.54ID:/EVL8M+q
>>394
手間の問題じゃなくて
なんでUIフレームワークの都合でモデルをいじらなきゃならんのかって話
2021/07/08(木) 07:53:01.19ID:0NJb5JqL
WPF使う場合はやはりモデルから対応しなければならない
それが嫌なので躊躇してしまう

モデルが依存関係を除去したところでINotifyPropertyChanged実装しないといけない
2021/07/08(木) 07:57:14.43ID:hcvY/pCa
>>394
なんで
INotifyPropertyChanged
ReactivePropert
みたいのがmodelにあんの?(;´д`)
2021/07/08(木) 11:13:00.38ID:h5za3xa1
MVVMで作ればINotifyPropertyChanged実装しなきゃいけないのはUIとバインドするViewModelだけだぞ
ModelをObservableにしたければ、独自のObservableインターフェース使えたければ使えばいいじゃん
Modelは無理にINotifyPropertyChanged使う必要はない
2021/07/08(木) 11:17:20.04ID:h5za3xa1
つか、要件としてModelをObservableにするならUIフレームワーク関係なく
何かしらのObservableインターフェースが必要になってくるんだが

他のフレームワーク、言語使っても同じなんだが頭大丈夫??
401デフォルトの名無しさん
垢版 |
2021/07/08(木) 11:40:47.13ID:dQrLp+p1
そのへんフィールドをプロパティにするだけで全部やってくれてたらもっとユーザー増えただろうな
2021/07/08(木) 11:43:27.90ID:h5za3xa1
INotifyPropertyChangedの実装がWPF特有の問題だと思ってるあたりが頭おかし

他のUIフレームワークでもモデルの変更に応じてUI変えるなら、Observeする仕組みが必要でINotifyPropertyChangedに相当する機能をどのみち実装しなきゃいけないのに

>>396,397
君は他のUIフレームワーク使ったときにどうやって実装するわけ??
2021/07/08(木) 12:47:08.14ID:hcvY/pCa
>>402
明示的なコード書かなくても
フレームワーク側でバインド解決できるのが
普通のMVVM
2021/07/08(木) 12:57:43.95ID:h5za3xa1
そういうフレームワークの具体例を1個上げて
2021/07/08(木) 13:10:14.80ID:/EVL8M+q
>>402
WPFみたいなバインディングはしません
406デフォルトの名無しさん
垢版 |
2021/07/08(木) 13:15:55.68ID:h5za3xa1
>>405
WPFみたいなバインディングしなくてもモデルをObservableにするならどの道何らかのインターフェースが必要になるって話をしてるんですけど理解してますでしょうか??
2021/07/08(木) 13:26:17.14ID:UhDpZcYs
>>398
通知のためだけのインターフェースがボコボコ増えてくのが嫌だからさ
全てRxのIObservableならよかったな
つかWPFもバインディングエンジンの部分をプラガブルにしろよな
なんでINotifyPropertyChangedみたいなクソにしがみついてるのか理解しかねるね
2021/07/08(木) 13:27:17.81ID:UhDpZcYs
てか今後新しい通知インターフェースを宣言した奴は死刑でいいよ
殺す
2021/07/08(木) 13:31:44.36ID:WFCJSrYx
趣味でやってるだけだからよくわからんけど同じプロパティー2回書かせるのやめてくれ
めんどくさい
2021/07/08(木) 13:37:39.15ID:hcvY/pCa
>>407
メリットは外だしなんで
カスタマイズして
オレオレ仕様に出来る以外ない
2021/07/08(木) 13:43:42.57ID:h5za3xa1
.net mauiのMVUってINotifyPropertyChangedの仕組み乗っかるの??
ブログの例ではState<T>とかあるけど
State<T>ならjetpack composeと同じやん
2021/07/08(木) 13:52:37.12ID:/EVL8M+q
>>406
だからバインディングはVVMまででいいって言ってんじゃん
413デフォルトの名無しさん
垢版 |
2021/07/08(木) 13:54:52.32ID:icewyiWh
これでいいじゃん。using追加してAnnotation付けるだけだよ
https://www.reactiveui.net/docs/handbook/view-models/boilerplate-code

[Reactive]
public string Name { get; set; }
2021/07/08(木) 13:55:12.53ID:Y0QirsOb
まあ他の言語のFWはばかでも書けるけど、
ことWPF含めMS主導のは一部の細かい主張に答えるためか、
やることが回りくどいんだよな
FW使ってるのに書くことが多いと言うか
415デフォルトの名無しさん
垢版 |
2021/07/08(木) 14:00:41.26ID:h5za3xa1
>>412
じゃあ、モデルでは好きなObservableインターフェース使えばいいじゃん
独自でもRxでもご自由に
2021/07/08(木) 14:05:52.94ID:/EVL8M+q
>>415
うわ頭悪そう
2021/07/08(木) 14:35:39.28ID:zQs4IMMf
>>404
case: knockout.js

<span data-bind="text: viewModel.value1"></span>
418デフォルトの名無しさん
垢版 |
2021/07/08(木) 14:48:13.57ID:h5za3xa1
>>417
それ全然違うから...
2021/07/08(木) 14:51:52.72ID:zQs4IMMf
>>404
case: React

<span>viewModel.value1</span>
2021/07/08(木) 14:57:32.77ID:h5za3xa1
>>419
>>417と同じのりで挙げてるならこれも違う
2021/07/08(木) 16:00:11.32ID:zQs4IMMf
>>420
おお、すまん
訂正

>>404
case: React

<span>{viewModel.value1}</span>
2021/07/08(木) 18:03:12.85ID:hcvY/pCa
>>404
case: Vue.js

<span>{{viewModel.value1}}</span>
2021/07/08(木) 18:32:35.94ID:0NJb5JqL
h5za3xa1は世間知らずのWPF至上主義者なんだ

許してやれとは言わないが冷たい目で見ればいいよ
2021/07/08(木) 18:33:09.06ID:hcvY/pCa
>>404
case: Blazor

<span>@viewModel.value1</span>
2021/07/08(木) 18:35:59.60ID:0NJb5JqL
ここからまたプロパティで書くべきかどうかみたいな話になるのだろうか

recordの仕様と実装が中途半端だから解決法にならない
2021/07/08(木) 18:45:37.60ID:hcvY/pCa
>>404
実はWPFでもstaticだけはObservableの実装無しでいけたりします。
なのでModelの直バインドも可能です。
更新はコントロールを強制再描画すれば良い。

case: WPF(static only)

<TextBox Text={x:static viewModel.value1}/>
2021/07/08(木) 19:30:36.43ID:3cBmXvB1
なんでView-ViewModelのバインディングの事例を並べてるの?
Modelの話じゃなかったっけ
2021/07/08(木) 19:48:49.81ID:0NJb5JqL
person.Nameみたいなのにバインディングされていて
Name変更時に通知する仕組みはモデルの責任じゃないけどそれが必要になる

他のフレームワークのように別の仕組みが通知するのが普通
WPFは普通じゃないし劣っている
2021/07/08(木) 20:03:20.69ID:h5za3xa1
だから、「WPFも同じことできてWPFも当てはまる」から
>>417,>>419全部間違っているっていってんのに
何いってのお前?アホ??
ちなみにWPFの場合は
<TextBox Text={Binding Path=viewModel.value1}/>
2021/07/08(木) 20:04:13.12ID:h5za3xa1
>>426宛ね
2021/07/08(木) 20:26:48.87ID:/EVL8M+q
引っ込みつかなくなって可哀想
2021/07/08(木) 20:35:30.05ID:h5za3xa1
>>428
その通り

>>402をうけての>>403だから、
「変更時に通知をする仕組みを一切実装する必要なくフレームワーク側で全部かってにやってくれる
」ようなこと>>403が言い出すからそういうフレームワークがあるならあげろっていってんのに

なんでどれも変更時に通知する仕組みを実装する必要あるフレームワークあげてんだよ

変更通知しないなら、WPFだって>>429で書いたようにINPC実装する必要ないしそんなフレームワーク
を挙げろっていってない
2021/07/08(木) 20:42:51.18ID:0NJb5JqL
person.Name見たいのはいつ変更したかなどはわかりやすいが
普通のクラスなどはいつどこで更新したのかが非常に追いにくい

目視でバグが確認できたとしてそれがどこで変更されてるのかがわかりにくい
バグがつぶしにくい
2021/07/08(木) 20:51:56.44ID:h5za3xa1
とりあえず、

読解力ないバカが多すぎってのだけはわかった
2021/07/08(木) 21:02:34.08ID:/EVL8M+q
やったじゃん
俺以外みんなバカ宣言して精神的勝利だ
2021/07/08(木) 21:07:38.15ID:FRcNf1lv
まぁ「俺の言いたいことを理解してくれない奴」は多いよな、いつでも。
2021/07/08(木) 21:17:18.89ID:UhDpZcYs
真の天才は死んでから評価されるのさ
2021/07/08(木) 22:41:40.59ID:j2+tCvGN
Mに変更通知機能無いって大変そうだな
2021/07/08(木) 23:02:26.20ID:hcvY/pCa
>>変更時に通知する仕組み

MVVMだから変更を監視する巧妙な仕組みがあって
(フレームワークによって思想が違う)
その仕様にのっとって適時勝手にバインドが動作する
のでコードは増えない
2021/07/08(木) 23:53:25.76ID:SSutR7CK
MをPOCOで作りたがる人いるよね。通知を実装するのも嫌がる。
2021/07/09(金) 00:11:25.67ID:hwC1YyL2
個人的には
(client: view, view-model)~network~(service: model)
としてる
入力バリデーションもmodelのみだ
へんかな?
2021/07/09(金) 00:39:31.73ID:fR2pG3Vk
>>440
それは世界の常識
WPFのMがおかしい
2021/07/09(金) 07:02:13.37ID:/l05Ymia
>>442
いや、WPFのMもPOCOで作るのが常識。
2021/07/09(金) 16:02:03.33ID:pQ/i3/CL
朕はPOCOなり
2021/07/10(土) 01:49:25.85ID:Is4zF1A7
ふーん
POCOでModel変更感知するのって面倒じゃない?
2021/07/10(土) 01:58:32.76ID:ZqXyUc92
POCOってなーに?
2021/07/10(土) 06:16:51.11ID:321/A5HW
Modelで変更通知なんかしない。
VMとMの区分けすらできないならMVVMで作らなきゃいいのに。
2021/07/10(土) 09:14:28.45ID:nAGZi/ZP
田舎者がなんか言ってるぞ
2021/07/10(土) 09:27:48.37ID:Rzopl14C
>>447
Modelの変更はどうやってViewModelやViewに反映されるの?
2021/07/10(土) 09:43:48.41ID:16vz6VAu
PODのようなものと混同してんのかな。
POxOから外部に何らかの通知をするのは別に普通だろ。依存の方向とか強くなりすぎるなとか一般的な注意をするだけ。
2021/07/10(土) 10:05:00.92ID:9ZKehVN0
>>449
Reduxならプロパティ変更イベントは必要ないよ
2021/07/10(土) 10:17:17.62ID:Rzopl14C
>>451
例じゃなくて仕組みを知りたい
VM側からポーリングでもしてるの
2021/07/10(土) 10:21:20.73ID:Cpxz5fTv
M自身が能動的に処理を行うことは無い。
Mに対してはVMから変更かける。通信やDB操作は外部プログラム(dll等)の役目だし、
ちょっと規模が大きいアプリなら外部通信などの処理は別プロジェクト(dll)にまとめられてるはずだろ?
外部プログラムが何らかの処理してMを変更し、外部プログラムの処理結果はVMでイベントハンドリングして
UIを更新する
2021/07/10(土) 10:29:02.22ID:Cpxz5fTv
VとVMで1つのプロジェクト(UI担当)
Mと通信処理などをまとめて1つのプロジェクト(System.Windowsを参照しなければ汎用ライブラリ)として
.net core等でも使用可能)
もちろんVMからSQL文を発行することもある

日曜大工レベルのアプリならVMの中で通信処理などビジネスロジックを全て含める
2021/07/10(土) 10:37:32.94ID:16vz6VAu
>>452
更新されたMが自発的にイベントを発火するか、VからMを更新するアクションが発生する毎に更新後のMの値を取りに行くかの違い。
flux/reduxのような一方向データフローでモデル更新がシリアライズされているから実用になること。
2021/07/10(土) 10:54:10.61ID:Rzopl14C
V以外からMが更新される場合は、Mを更新した処理とVMが強く結合されるってことね
2021/07/10(土) 10:56:13.18ID:KTvmhX8f
Mの発火をVMが受け取りまた発火、Vが描画とか手間かかるしチームで案件やってると教育コストもかかる。
技術に疎いマネージャーだとクリックイベントに全部書けやとか言ってくるんだよね。
2021/07/10(土) 11:07:48.66ID:16vz6VAu
>>456
flux/reduxについて言えばアクション自体への結合は不要。
基本的にMは全部単一のストアにまとめられていて、どこかが更新されるアクションが発生したら全員でMの更新を見に行くような感じ。
2021/07/10(土) 11:09:30.03ID:owBtnLy3
>>456
モデルにぶら下がってるVMはフレームワークが把握しているから、フレームワークにMの更新メッセージを投げるだけだよ
2021/07/10(土) 11:13:06.20ID:owBtnLy3
なおMのどのプロパティが更新されるかの特定も不要で、VMはあくまでMの現在の状態に対する関数として更新後のV全体を出力するだけでいい
あとはフレームワークがよしなに差分を取って変更を反映してくれる
2021/07/10(土) 11:14:26.03ID:Is4zF1A7
Mへの更新は全部フレームワーク経由で実施するってことか
フレームワーク君頑張るなw
2021/07/10(土) 11:17:08.14ID:2DdNTqcD
>>461
更新されたMをフレームワークに通知するだけだ
フレームワークの責務はメッセージのルーティングに過ぎなくて、Mがフレームワークの配下にいなきゃいけない訳じゃないよ
2021/07/10(土) 11:26:26.12ID:uwFcR1va
ちなみに>>453,454はただのMVVMだよね??
2021/07/10(土) 11:28:40.75ID:Rzopl14C
V以外でのMの更新自体はM寄りの処理だよね
Mの各プロパティから個別に更新通知が行くか、代表して更新通知が行くかの違いであって
Modelからの変更通知が無いってのはちょっと違うな
2021/07/10(土) 11:35:14.88ID:owBtnLy3
>>464
ルーティングの責務をM自体ではなくその外で持つことで、M自体を汚さなくて済むようになった
メタ情報を外出しするという点ではEFのPOCOなんかも似たような仕組みだな
466デフォルトの名無しさん
垢版 |
2021/07/10(土) 11:43:48.27ID:Is4zF1A7
>>462
フレームワークはMが更新されたことをどうやって知るの?
2021/07/10(土) 12:19:02.06ID:uwFcR1va
>>466
ああ、わかったただのMVVMの変種か
今までだって、MVVMで作ってた時はModelでimmutableなのをあったけど、
イメージとしてModelを全部immutableにして、ViewModelのほうに全部押し込めって話か

極端な話Modelを全部immutableにして、後のつじつまあわせは全部ViewModel(Store)で全部やれってことww

負荷が全部ViewModel(Store)にいくってことじゃね??
2021/07/10(土) 12:32:05.86ID:uwFcR1va
今までだって例えばMVVMでTwitterアプリを作るとき
まず、汎用的なTwitterAPIを叩いてPOCOを返すだけのライブラリを作って(A)

(A)を内部で使ったModelを作る
必要ならここでINPCの変更通知を実装(B)

で、後はViewModelをつくるだけど、

(B)をすっとばして、ViewModelで(A)を使ってここですべてやる

こんな感じ??
2021/07/10(土) 12:35:43.17ID:uwFcR1va
だからそもそも今までだってどこのModelか知らんが(A)の部分は汚染されてないけどな..
二つ似たようなの作ってるが..
2021/07/10(土) 12:52:18.73ID:uwFcR1va
もちろん、Modelをmutableにしてもいいけど、ViewModel(Store)内でModelを直接更新するからModelの変更通知機能は全く必要なくて、更新後ViewModel(Store)がViewに状態が変わりましたよって通知できればいい

やっと理解できました
ありがとう
2021/07/10(土) 15:15:27.78ID:xJQjD86t
mvcやらmvvmやらに全てあてはめようとして考えて、
訳わかんない考えに染ってるのばっかだな
2021/07/10(土) 15:53:06.08ID:fmB/UGP2
まあデザインパターン病と同じ。
2021/07/10(土) 16:12:10.43ID:xJQjD86t
>>470
これが何も知らない新人君でもやる普通の実装なんだがな
2021/07/10(土) 18:17:59.49ID:Is4zF1A7
>>470
そうすると複数のビューで一つのモデルを参照しているようなときは
ひとつのVMだか何だかが複数のビューと対話するん?
2021/07/10(土) 18:34:12.08ID:X6uqNK3l
というかこれって答えあるのか?
2021/07/10(土) 18:37:01.39ID:yemPkoko
オブザーバーでも
イベントでも
好きなパターンで実装すればよろし
2021/07/10(土) 18:52:36.88ID:T1N+jIqA
>>470
それは間違いだよw

VMにM更新のロジックを書くなよとw
VMごとにロジック書いて不整合があってバグ発生するだけ
2021/07/10(土) 18:54:15.71ID:T1N+jIqA
VMからMにはメッセージのみ送る

馬鹿はVMからMをいじる
2021/07/10(土) 18:57:20.02ID:T1N+jIqA
WPFで本気でMVVMやりたいならMに通知もみんな書くんだよ
これがモデル汚染

最近はビジネスロジック層を作ってお茶を濁してるけどそれも結局通知はどこなのか普通に迷うところ
2021/07/10(土) 19:16:41.13ID:uwFcR1va
>>479
>WPFで本気でMVVMやりたいならMに通知もみんな書くんだよ
MVVMの話でいいならそれはrigaya?が勝手に言ってるだけだぞ
別に正解の定義なんてないだろうしどっちが正解とは言
言わんが

Modelのメソッドは結果を返さず、メソッドの呼び出しの結果、自身の状態(プロパティ)を変更するだけってやつだろ
2021/07/10(土) 19:28:32.13ID:xJQjD86t
フレームワークの方法論は
その開発者が一方的に押し付けてる理屈なのに
気づけない馬鹿
2021/07/10(土) 19:35:48.59ID:T1N+jIqA
違うよ
知性の問題だ
それが理解できない馬鹿がバグを量産する
2021/07/10(土) 19:36:54.45ID:T1N+jIqA
馬鹿が自分が馬鹿でないと思って偉そうに何年もクソコードを書いてMVVM最高と言ってるだけだ
2021/07/10(土) 19:38:06.79ID:uwFcR1va
うん、rigayaは開発者じゃないしね
2021/07/10(土) 19:40:04.65ID:T1N+jIqA
>>484
うがやじゃなくてお前ともう一人が馬鹿なんだ

やっと理解できましたじゃねーよ
2021/07/10(土) 19:43:32.20ID:xJQjD86t
modelとviewModelの責務分けは
馬鹿には出来んよなーー
2021/07/10(土) 19:47:15.76ID:uwFcR1va
外人でrigayaと同じ主張してる人見たことない
Modelで通知をするのが普通とか言ってるのはお前が勝手に思ってるだけ

>>481でMVVMを本当に作った人が特定できるならまずそれを特定してくれ。で、Modelで変更通知を実装するのが普通ってどこに書いてあるか教えてくれ
2021/07/10(土) 19:52:15.95ID:uwFcR1va
もちろん、ViewModelはビューの状態を保持し、Modelに対してはModelのメソッドを呼んで
ビューに関するロジックを書くだけだぞ

Modelに変更通知機能あるかないかは全く関係ない話

勝手にModelに変更通知があるのが普通と思ってのはお前
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況