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/
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に変更通知があるのが普通と思ってのはお前
2021/07/10(土) 19:52:27.91ID:xJQjD86t
フレームワークつかうと
やっぱ宗教じみた変なのが誕生するなーー

まずはプリミティブなライブラリのみ使用して
デザインパターンとか理解してみる事をおすすめする
2021/07/10(土) 20:01:26.66ID:16vz6VAu
>>478
「メッセージのみ送る」と「いじる」の違いはこいつの頭の中にしか無いんだろうな。
2021/07/10(土) 20:06:44.05ID:uwFcR1va
MVVMでViewModelの責務は>>488なだけ

Modelが変更通知を実装するしないかは関係ない

MVVM黎明期、rigaなんとだけが日本で声上げたからあいつの馬鹿信者が増えたんだろう
しかも日本だけ笑い
2021/07/10(土) 20:17:00.58ID:MxfUHgdm
だから>>362で最初からバインディングはVVMまででいいって言ってるじゃん
何をそんな喧嘩腰で議論する必要があるのか
2021/07/10(土) 20:23:04.54ID:xJQjD86t
“model” と “view、viewModel” の開発者は
分けた方がいいかもな

modelだけで業務が回せるようになってればいいだろ
実際modelはpythonで実装するの増えて
担当者も異なる事が多いわ
2021/07/10(土) 20:43:24.78ID:Is4zF1A7
>>492
バインディングの話じゃないって分かってない?
2021/07/10(土) 20:55:14.46ID:MxfUHgdm
>>494
え?変更通知なんだから要はバインディングの話でしょ?
2021/07/10(土) 21:06:48.12ID:o3oxPhaH
今日だけで50レスも進んでるのか
ヒマすぎだな
2021/07/10(土) 21:45:12.95ID:uwFcR1va
例えば、ModelがImuutableでINPCを実装しないとするよ。で、Modelの更新はModelのメソッドを呼んで、
メソッドの戻り値として新しいインスタンスを返すとする
class Model { // ImmutableなINPCを実装しない
 public Task<Model> UpdateAsync() <- 新しいインスタンスを返す
}

で、ViewModelから更新かけるとき、更新後、最新の情報に更新する必要あるなら、それは
あくまで表示の都合だから、ViewModelにそのロジックを書いて問題ないだろ??

class ViewModel {
 public void Hoge() {
  var result = await model.updateAsync()
  // resultの結果を元にViewModel更新
 }
}

ModelがINPCを実装するかなんて本来はMVVMには関係なく俺にはこれも立派なMVVMにしか見えねぇわww
2021/07/10(土) 21:59:07.18ID:uwFcR1va
もちろん、MVVMの厳格な定義なんて知らないし、極論すれば言葉の問題になるから
どっちが正解なんて言うつもりはないが、

rigaなんとか的に
「ModelはINPCを実装して、Modelのメソッドは戻り値は返さないで、
メソッドの呼び出しの結果自身の状態を変更し、INPC経由でViewModelに通知する」


おまえらこれだけがMVVMだと思ってるだけじゃんw
2021/07/10(土) 22:07:37.44ID:321/A5HW
>>497
うん、これが王道の作り方
2021/07/10(土) 22:14:04.55ID:uwFcR1va
悪いけど売られた喧嘩で言わしてもらうが
>>485,486,490

はバカ三兄弟だわww
2021/07/10(土) 22:54:51.35ID:x1ppTpnc
ID:uwFcR1va
この人のサーバーサイドには
何が実装されてるのだろうか...
2021/07/10(土) 22:55:10.24ID:16vz6VAu
>>500
なりほど、お前さん>>478の言う「メッセージのみ送る」と「いじる」の違いが理解できるならちょっと説明してみてくれないか。
2021/07/10(土) 23:07:03.07ID:uwFcR1va
>>502
あ、ごめんひょっとして間違ってたら謝るわ

>>490って俺に対するあてつけ?じゃなかった??
ただの>>478へのレスなら謝るわ。すみませんでした。

つか、あとrigaじゃなくてググるとugaだったw
2021/07/10(土) 23:59:12.78ID:Wb8JMrdb
awaitはasyncが必要だろう。
2021/07/11(日) 00:15:04.56ID:BeeJLMuH
読みづらいからよ
続けるなら名前欄にスタンスを書いてくれないか
2021/07/11(日) 01:46:58.32ID:2ghBsept
やっぱりWPFはめんどくさいなw
507デフォルトの名無しさん
垢版 |
2021/07/11(日) 02:11:56.24ID:vIt/TVMn
>>495
そこまで話を広げるとMに通知機能があろうが無かろうが全部バインディングだろうよ
今問題になってんのはVはVMに依存してる前提で
VMとMの問題だと思うんだが違うんかな
508デフォルトの名無しさん
垢版 |
2021/07/11(日) 02:13:20.15ID:vIt/TVMn
>>506
WPFはめんどくさいっていうのが他の後発フレームワークとの比較なら分かるけど
WinFormと比較するんだったら比べものにならないくらい簡単だぞ
2021/07/11(日) 02:52:00.72ID:OgOa7vqd
>>508
ほんまかいな
2021/07/11(日) 02:59:38.37ID:bArpP16/
楽⇔面倒
簡単⇔難しい
単純⇔複雑
区別できない奴多すぎでは
2021/07/11(日) 08:40:13.02ID:x50DSKku
>>501
予想
ID:uwFcR1va 氏の構成

(client)
View
ViewModel
Model
Database Client Library


↑↓

(server)
Database Server
2021/07/11(日) 12:56:04.27ID:qjFfZwWG
一人ホームラン級の馬鹿がずっとレスしてるだけだな

MVVMでMから変更通知出すのは当たり前
VMでモデル変更して通知と言うけどモデル内で変更が生じた場合VMが変更通知出してるのかw?

VMは画面ごとに作るけどMに対応した処理はどこに書かれるんだ
まさか画面ごとか?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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