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

レス数が900を超えています。1000を超えると表示できなくなるよ。
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/
2021/09/12(日) 11:02:35.52ID:CGi/+BiI
>>842
できました、ありがとうございます。ただ、ElementNameは指定しなくてもいいんですか?
(今回はMyWindowだから動いているかもしれないですけど、別のに変わったら動かなくなるとかありますか?)
<Window x:Class="DataTable_CodeBehind.MainWindow"
x:Name="MyWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation";
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml";
xmlns:d="http://schemas.microsoft.com/expression/blend/2008";
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006";
xmlns:local="clr-namespace:DataTable_CodeBehind"
mc:Ignorable="d"
Title="MainWindow" Height="250" Width="400">
<Grid>
<!--<DataGrid Name="dataGrid" ItemsSource="{Binding dt, ElementName=MyWindow}" AutoGenerateColumns="True"/>-->
<DataGrid Name="dataGrid" ItemsSource="{Binding}" AutoGenerateColumns="True"/>
</Grid>
</Window>

public partial class MainWindow : Window
{
public DataTable dt { get; } = new DataTable();
public MainWindow()
{
dt.Columns.Add("MyColumn", typeof(string));
dt.Rows.Add("Row of data");
InitializeComponent();
dataGrid.DataContext = dt; // XAMLでItemsSource="{Binding dt, ElementName=MyWindow}"が指定されてたらコメントアウトしてもOK
// でも、ElementName=MyWindowは指定しなくてもいいの?
}
}
2021/09/12(日) 11:14:27.19ID:CGi/+BiI
>>844
>>845の例だと具体的にはどう書きますか?

dataGrid.SetBinding(ItemsControl.ItemsSourceProperty, dt);

と書いてもダメでした。
2021/09/12(日) 11:28:19.94ID:CGi/+BiI
しまった、連投すみません

>>842
dataGrid.DataContext = dt;
ではなくて、
dataGrid.ItemsSource = dt;
みたいにできるはずなんですがご存じないですか?
2021/09/12(日) 16:39:23.72ID:2cHj/0c+
>>846
それだとオーバーロードが別の
dataGrid.SetBinding(ItemsControl.ItemsSourceProperty, "dt");
でいけない
840と同じなら
var bind = new Binding("dt"){ElementName = "MyWindow"};
dataGrid.SetBinding(ItemsControl.ItemsSourceProperty, bind);
して呼び出してみるとか。外からなんでなんか間違えてるかも
でも目的が達成されたからいいかな

バインディング宣言の概要 - WPF .NET Framework | Microsoft Docs
https://docs.microsoft.com/ja-jp/dotnet/desktop/wpf/data/binding-declarations-overview?view=netframeworkdesktop-4.8
2021/09/12(日) 18:46:39.81ID:D2v+xufE
そういやVM使わないWPFの挙動など殆ど把握していないわ
2021/09/12(日) 20:02:22.06ID:CGi/+BiI
>>848
仰る通り、

var bind = new Binding("dt"){ElementName = "MyWindow"};
dataGrid.SetBinding(ItemsControl.ItemsSourceProperty, bind);

で行けました!
これで行けるなら{ }の中を変えていろいろ指定できそうですね。

# ちなみに、
# dataGrid.SetBinding(ItemsControl.ItemsSourceProperty, "dt");
# は、DataGridは表示されるんですけど、
# ColumnもRowも表示されませんでした。

ありがとうございました!
2021/09/13(月) 13:34:55.60ID:1pSY0+gc
INotifyPropertyChangedってもっと脳死で簡単にできないの
2021/09/13(月) 13:41:22.00ID:8KbkkNk8
それを言ったらIEnumerableの方が頻出でもっと面倒では
2021/09/13(月) 14:11:11.72ID:FY5gKLvy
>>851
INotifyPropertyChangedを使わない。
馬鹿の一つ覚えで何でもかんでもVM作る病からの脱却せよ。
2021/09/13(月) 14:41:19.39ID:OQ1a75jl
>>853
更新の通知はどうするの
2021/09/13(月) 15:04:32.55ID:F74I8HoI
>>851
VM用の基本クラス使ったら楽だと思うけど
2021/09/13(月) 15:41:03.02ID:orh3RydC
>>851
むしろあれ以上に簡単にできないやろ
自動実装プロパティにイベントも自動実装されたらパフォーマンスガタ落ちになるんじゃ
2021/09/13(月) 15:53:20.23ID:ZNdqAxbM
結局WinUI3もWPFと実装方法は大して変わらないの?
2021/09/13(月) 17:07:46.28ID:Z203dzwp
>>854
通知も何もない。
UI操作を起点にUIを直接書き換えて終わりだろ。
それで事足りるアプリケーションは山ほどある。
2021/09/13(月) 17:28:00.98ID:bEKVtUlw
>>851
propfullとタイプしてからタブキー2回押すんだ
2021/09/13(月) 17:29:13.28ID:u3iBp6jh
ハッキリ言って個人レベルとか5000行未満のアプリならMVVMなんかより、ひたすらイベントパンドラで書いた方が見通しもいいし実は修正もしやすいよ。

VとVMがわかれててもC#てデスクトップのツールじゃメリットあまりないし。
ほぼ間違いなく同じ人間が書いてんだから。
別の人間がXamlだけ編集してるとか成功ケースないでしょう。
WPFは所詮デスクトップのツール向きで、商用アプリ向きではないし。

MがGUIでもコンソールでも変わらないAPIになるよう意識してればいいだけ。
2021/09/13(月) 17:52:25.62ID:8KbkkNk8
Caliburn.MicroならPropertyChangedBaseが実装済み、例を示すと
private string _LogBox;
public string LogBox
{
get => _LogBox;
set => Set(ref _LogBox, value);
}
一方XAMLは
<TextBox x:Name="LogBox" />
これでLogBoxに何か入れるとテキストボックスに反映される
十分すぎるほど簡単に感じるけど・・・これすら無理な人いるかも知れない?
2021/09/13(月) 18:29:40.64ID:CYNkmf4m
>>851
それを実装した汎用valueクラスを作ってそれを使う。

>>858
それが当たり前だよね。
完全にMVVMするのが目的になってしまった
なれのはて
2021/09/13(月) 20:22:16.87ID:4h53lU/m
>>857
VMの書き方はだいたい同じだが、Viewでx:Bindが使えるからインテリセンスが効くし型のチェックもコンパイル時にやってくれる
あと、Viewから右クリックの「定義へ移動」でVMの変数定義に移動できる
864デフォルトの名無しさん
垢版 |
2021/09/13(月) 21:03:21.49ID:/bWkDGfh
しょぼいプログラムほどMVVMでの実装も楽だからINotifyPropertyChangedを避ける理由がよくわからない
2021/09/13(月) 21:18:47.94ID:CYNkmf4m
しょぼいから
スケールメリットでねーーんじゃね?
2021/09/13(月) 21:21:14.98ID:bEG2fzdP
バインドしない人は文字−数値の変換も自分で書くの?
2021/09/13(月) 21:46:08.83ID:9YR282N/
>>860
VとVMの分離はべつにデザイナーとの分業だけが目的じゃあないが。というか重要度としては低い。
WPF知らない人にありがちな典型的な誤解。
2021/09/13(月) 22:02:18.04ID:Dz4DY8v7
いまだにMVVMに親を殺されたようなのがいるね
イベントハンドラしこしこ書くのはもういやだよ
でもWPFはFrameをもっとMVVMフレンドリーに作ってほしかたよ
2021/09/13(月) 22:10:10.87ID:u3iBp6jh
いや、知ってるからなんだけどw
ボダン押したら押したら更新する、同期性も何もない。

APIを呼ぶだけ。
大きくなる予定なし。

こんなのすらさえWVVMしだすっていうw
2021/09/13(月) 22:41:51.00ID:FSwgcC5n
INotifyPropertyChangedとINotifyCollectionChangedの違いを知りたいです。
このサイトを参考に話します(Xamarinですけど):
https://qiita.com/furugen/items/18bd2a521d1fa9927212
これは
public class MemoData
{
public string Title
{
get;
set;
}
}
のTitleがプロパティだから、
public class MemoData : INotifyPropertyChangedなんですか?
もし、上のが
public class MemoData
{
public List<string> Title
{
get;
set;
}
}
だったら、
public class MemoData : INotifyCollectionChangedになりますか?
それとも、この場合はListからObservableCollectionに変更するだけで解決ですか?
ObservableCollectionが元々INotifyCollectionChangedを含んでいるのは知っています。
また、public class MemoData : INotifyCollectionChangedと書くケースは皆無ですか?
2021/09/13(月) 23:16:04.60ID:Dz4DY8v7
何をしたいかによる
2021/09/13(月) 23:44:39.21ID:CYNkmf4m
>>869
Mvvmじゃなくて通知の問題ね。
WPFのMvvm以前はこんな問題は発生してないねーー
2021/09/14(火) 05:34:23.96ID:TNbC6wpH
>>861
冗長。
コード側の6行は不要。XAML側の1行だけでOK。
2021/09/14(火) 08:22:12.46ID:Xw7cSOKQ
>>868
まだまだ初心者だな。
アプリに合わせて最適な実装方法を選択できるようにならなきゃ駄目だそ。道具は素材に合わせて使い分ける。
MVVMはあくまで道具の一つ。
2021/09/14(火) 08:31:12.46ID:ix6qKsp0
MVVMは目的じゃない
2021/09/14(火) 10:03:00.45ID:O0SG+hYH
>>873
ケースを想定せずにOKも何もないでしょうに
2021/09/14(火) 12:11:35.18ID:MzGXbjCU
コードビハインド禁止ゲームとか
アホの極み!
2021/09/14(火) 13:51:43.59ID:OUZkxtLl
今はPrismだけ使ってるけど、みんなReactiveProperty使ってるの?便利?
2021/09/14(火) 19:55:37.76ID:jxlCGXSG
>>874
もちろん、ポトペタやりたい人にとってはFormsがベストだしずっとそれを使い続けていればいい。
2021/09/14(火) 20:32:08.68ID:7Ijls0Z8
この辺は変な布教をした奴のせいでずっと尾を引いてるな
881デフォルトの名無しさん
垢版 |
2021/09/14(火) 21:59:50.08ID:GpK/E3pW
>>874
WPF使うならMVVMが常に最適解
MVVMイヤならWinForm使えばええねん
882デフォルトの名無しさん
垢版 |
2021/09/14(火) 22:01:29.25ID:GpK/E3pW
>>878
俺の個人的好みだとPrismは中小規模だと大げさすぎる
ReactivePropertyはもう手放せないレベル
でもいまだにBindingの .Valueを書き忘れてハマるw
2021/09/14(火) 22:05:51.96ID:bJ98HSzm
俺なんかWinFormsでやるときでさえReactiveProperty使ってMVVMやるようになってしまったよ
884デフォルトの名無しさん
垢版 |
2021/09/15(水) 01:05:39.31ID:jggBe0Ff
ポトペタやりたいならノーコードローコードでいい
2021/09/15(水) 06:31:36.42ID:4HoLv0k1
>>879
そう考えるってことはWPFを全然使いこなせていないってことだぞ。
WPFはFormsと比べればMVVMとの親和性が高いが、MVVMで作りやすいってのはWPFのメリットのごく一部。

>>881
全然違う。
日本語もWPFも勉強しなおし。
MVVM使うな、じゃなくて使うべきものに使えって書いてある。
思考停止してWPFだから必ずMVVM、は技術者として恥ずかしいぞ。

>>883
FormsにMVVMは馴染まない。
ちゃんとフレームワークに合った設計をしないと。
2021/09/15(水) 11:37:21.40ID:S1ATpspQ
煽り屋は下痢便食わせて多摩川にでも流すぞ
2021/09/15(水) 12:22:16.17ID:jnuePZVr
君にはすべてのクラスに
void Update(bool force = true)
を書く事を許可しよう、頑張りたまえ
2021/09/15(水) 12:50:15.43ID:MMIM4SfG
言っている事は正しいしただの指摘、煽りではないだろ
2021/09/15(水) 14:58:00.53ID:3TKYe9Fz
>>885
>FormsにMVVMは馴染まない。
お前の感覚以外にちゃんとした理由があるならぜひ
2021/09/15(水) 15:46:29.15ID:u+gVrdUN
理由もクソも、MVVMはそもそもWPFのデータバインディングを活用するために考案されたデザインパターン
双方向バインディングを使用しないなら定義上MVVMではない
2021/09/15(水) 15:57:04.37ID:a6LjJ0wO
やったこと無いけどFormsでもデータバインディングできるんじゃ?
2021/09/15(水) 16:02:38.01ID:FpSMo0oE
>>890
Forms+ReactivePropertyで双方向バインディングやってるけど
2021/09/15(水) 17:02:45.49ID:3TKYe9Fz
>>890
お前の言うMVVMの定義を教えてくれ
2021/09/15(水) 17:05:49.55ID:QKlVFcsu
業界アキーテクチャ的には
双方向バインディングはバッドパターンだ
糞認定済み
2021/09/15(水) 17:09:11.47ID:QKlVFcsu
react等の先端frameworkに比べると
思想的にかなり見劣りする
2021/09/15(水) 17:28:11.46ID:wmRmGPP4
次はMVUだったっけ?
897デフォルトの名無しさん
垢版 |
2021/09/15(水) 18:32:29.56ID:IqGZburM
実行ファイル(.exe)が出力できて将来性のある
プラットフォームってやっぱりWPFしかないのかな?
2021/09/15(水) 18:36:43.11ID:R2NlFkLx
将来性はないです
2021/09/15(水) 18:36:44.91ID:jnuePZVr
最先端はなんだろうAvaroniaとか?
SilverlightもWindows Phoneも、昔はいろいろあったよね
2021/09/15(水) 18:47:44.45ID:EcTTP5JU
>>897
WPFやるぐらいなら今後はWinUI3じゃ?
901デフォルトの名無しさん
垢版 |
2021/09/15(水) 19:00:42.07ID:IqGZburM
WPFに将来性はあまりないのか

>>900
ありがとう。ちょっと調べてみる
902デフォルトの名無しさん
垢版 |
2021/09/15(水) 20:53:25.10ID:bT20IgU4
>>885
日本語勉強するのはあんただよ

>
2021/09/15(水) 21:01:46.66ID:u4qV17E7
>>890
バインディングはあまり関係ないな。どっちかというと依存の方向がV→VM→Mだというのが重要。
そういう意味でFormsで真似しても似て非なるもの。
2021/09/15(水) 21:09:50.88ID:jnuePZVr
すでに10年以上過ぎてて将来性とか言われても
枯れてる方に分類されると思うんだけど、一体どんな期待してるんだ
2021/09/15(水) 21:13:29.91ID:FpSMo0oE
>>903
その方向の連携もFormsでできますけど
2021/09/15(水) 21:43:58.90ID:u4qV17E7
>>905
その「連携」ってどういう意味で使ってる?
一般に依存の方向と制御の方向は別物だがここで重要なのは依存の方向。
2021/09/15(水) 22:43:25.21ID:FpSMo0oE
>>906
もちろんVの表示はVMとMに依存してるよ
2021/09/15(水) 23:04:57.93ID:jnuePZVr
依存っていうからてっきり依存関係プロパティの話かと思ったら、全然違ってた
2021/09/15(水) 23:17:22.66ID:u4qV17E7
>>907
やっぱりなんか理解してない。ここではいわゆるSOLID原則のDで言う依存性のこと。
MVVMでVが直接Mに依存することはない。
2021/09/15(水) 23:30:44.49ID:qRxK7g6Y
Vで必要なMを作るんだから依存しないわけがない
2021/09/15(水) 23:49:11.29ID:u4qV17E7
>Vで必要なMを作るんだから依存しないわけがない

「依存」の意味が通じてないとそもそも会話にならんな。
2021/09/15(水) 23:50:13.08ID:VJ+jTlKE
>>882
ReactivePropertyはメンテナーが実質ひとりだからなぁ。
その.Valueも意外と面倒くさいんだよね。
2021/09/15(水) 23:54:05.43ID:VJ+jTlKE
ObservableCollectionがAddRangeに対応して、
主要なWPFコントロールがAddイベントにてe.NewItemを同時に複数受け付けてくれれば神アプデなんだけどMSやってくれないかな。

ObservableCollection関連は、各ItemへのProperyChangedの登録/解除が超絶に面倒臭いんだけど、ReactivePropertyだとお手軽になる?
2021/09/16(木) 00:20:59.60ID:eraz+HIm
>>911
なんかFormsでMVVMできないことにするために適当な理屈をウダウダ後付けで言ってんな
2021/09/16(木) 00:38:24.68ID:tuIfCOpX
|\/| W(
916デフォルトの名無しさん
垢版 |
2021/09/16(木) 01:24:47.16ID:fPzViGfa
>>912
今はokazukiがメインメンテナ?
彼がやめたら俺がやるわ
917デフォルトの名無しさん
垢版 |
2021/09/16(木) 01:54:46.93ID:fPzViGfa
>>913
極力簡易記述できるようにしてると思うよ
2021/09/16(木) 03:51:43.21ID:x4RkoMHs
おまえら酒どんくらい飲んでる?
2021/09/16(木) 08:50:08.52ID:EaJ+z9b7
MVVMはXAMLやFXMLといったマークアップ言語があって初めて実現する
XAMLを信じないものに未来はありません
XAMLは偉大にして唯一神と3回唱えるのです
920デフォルトの名無しさん
垢版 |
2021/09/16(木) 12:17:15.94ID:jImn+LiB
ObservableCollectionで個々のItemのPropertyChangedを取りたいときって、
NotifyCollectionChangedAction.Add・RemoveにPropertyChangedのイベント購読を登録・解除
しますよね?

その配列をClear()しちゃったら、Removeでの解除を通らないと思うのですが、
この場合、メモリリークしますか?
2021/09/16(木) 12:57:51.05ID:eraz+HIm
>>920
NotifyCollectionChangedAction.Reset飛んでこない?
922デフォルトの名無しさん
垢版 |
2021/09/16(木) 13:30:05.34ID:jImn+LiB
>>921
自分も最初はReset飛んできたとき解除すればいいと思ったんですが、配列がすでに消去済みなので解除できないことに気づきました。
各ItemのコンストラクタとDisposeに登録解除を書くしかないのかな。
2021/09/16(木) 14:17:14.99ID:sOgFGA/J
>>903
向いてるかどうかは別にして、
FormをVとしてVMとM作ってバインディングすればMVVMできると思うんだが
>似て非なるもの
どこが異なるんだよ?
お前の言う本当のMVVMってなんだよ
2021/09/16(木) 14:20:02.81ID:sOgFGA/J
ああ、バインディングはMVVMの構成要件じゃないのね
ますますお前の意見がわからんわ
2021/09/16(木) 14:31:38.92ID:eraz+HIm
>>922
ObservableCollectionに
protected override void ClearItems()
ってのがあるから
ObservableCollectionの派生クラス作ってClearItems()をオーバーライド
ClearItemsが呼ばれたタイミングで購読解除すればいいと思う。
926デフォルトの名無しさん
垢版 |
2021/09/16(木) 14:37:43.93ID:eraz+HIm
>>922
public class MyCollection<T> : ObservableCollection<T>
{
protected override void ClearItems()
{
//ここで購読解除
base.ClearItems();
}
}
927デフォルトの名無しさん
垢版 |
2021/09/16(木) 15:14:51.39ID:jImn+LiB
>>926うおーすごい。stack overflowでもそこまでドンピシャな回答無かったです。
ありがとうございました。
2021/09/16(木) 15:50:04.83ID:4N92z3xf
コレクションをオーバライドして
改良するってアーキテクチャ知らない人多いね
929デフォルトの名無しさん
垢版 |
2021/09/16(木) 18:38:42.38ID:EvK5hxPz
結論としては、超絶に面倒臭いって事か
2021/09/16(木) 19:41:02.61ID:yaf4gWdF
仮にオーバライドしないで出来るならその方がずっと楽だしな
2021/09/16(木) 22:04:26.97ID:vfYN11/r
>>923
クリーンアーキティクチャのあの同心円の図を想像するとわかりやすい。一番外側がVで中心がM。
その依存性逆転のためにバインディングという仕組みを使っているだけに過ぎない。
2021/09/16(木) 23:23:17.08ID:8UT+IRDB
https://docs.microsoft.com/en-us/archive/blogs/johngossman/introduction-to-modelviewviewmodel-pattern-for-building-wpf-apps
バインディングが関係ないとか言ってる奴はこのMVVMの原典を読んでおくように
> Model/View/ViewModel also relies on one more thing: a general mechanism for data binding.
2021/09/17(金) 01:51:24.22ID:oPdLmI0u
In practice however, only a small subset of application UI can be data bound directly to the Model, especially if the Model is a pre-existing class or data schema over which the application developer has no control.
モデルが既存のクラスで開発者がコントロールできない場合は、UIの一部のみを直接モデルにバインドできます。
ってあるけど、既存のクラスなんてINotifyPropertyChanged実装してるわけないし、どういう意図なんだろ?
OneTimeならそりゃできるだろうけど。
2021/09/17(金) 02:13:01.71ID:OCPIK6qi
>>931
バインディングが単なる手段に過ぎないという意見は分かった
で、
>Formsで真似しても似て非なるもの。
はどういうことなんだ?
お前の言う真のMVVMとはどういったものなんだ?
2021/09/17(金) 07:24:25.96ID:9pvNRBKH
滅茶苦茶な機械翻訳を鵜呑みにして混乱してる初心者あるある
また断続的な絞首刑が発生しちゃうね
2021/09/17(金) 08:29:29.04ID:oPdLmI0u
>>935
正しい翻訳と意図を教えてください。
2021/09/18(土) 11:02:29.85ID:R9rxcswy
>>935
正しい翻訳と意図を教えてください。
2021/09/18(土) 13:27:50.51ID:+rKdBgY8
Microsoft Silverlightがオープンソース化、「OpenSilver」ベータ版リリース
https://news.mynavi.jp/article/20210916-1974193/
2021/09/18(土) 14:29:04.75ID:4CYZLhbb
>>938
MSはどっち行きたいねん?
一つがっちりしたのを標準で出せや!
2021/09/18(土) 14:42:52.80ID:hjEU6C9z
Silverlightは救済策だろう
メインストリームはWinUI
2021/09/18(土) 14:59:53.94ID:owvkbREO
ActiveXじゃなくてWASMベースになったってのが興味深いな。
デスクトップ版も用意したうえでBlazorと組み合わせてほしい。
2021/09/18(土) 15:32:32.42ID:kMbDjnXI
ソースジェネレーターでバインディング周り上手い事オーバーヘッド無しに出来んかな
2021/09/18(土) 15:59:37.03ID:+rKdBgY8
>>939
まだわからんの
オープンソースだよMSは
2021/09/18(土) 16:06:02.78ID:5s23uQXu
MSとどういう関係があるのか読んでも分からん
レス数が900を超えています。1000を超えると表示できなくなるよ。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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