初めてのWPF 13日目
2019/02/13
GrandTotalを連動させたい
一番左側のボックスができれば後は楽勝ですが、子コレクションのメンバーのプロパティの変化(グリッド中の「個数/枚数」が変わった時)をViewModel側で取得するにはどうするのがいいのか分からない。
Web版MVVMだとこんなイメージ。
非常に基本的な機能だと思うのですが、基本的過ぎてかサンプル見つけられず。
公式ドキュメント(いつの間にかlegacyの下に)みながらListをObservableCollectionに変え、MoneyCountのセッターでプロパティ名を外してみても、プロパティの変更が受け取れず。
OnPropertyChanged();更にドキュメントに従いListCollectionViewでラップして見たらイベントは3つだけ。
CollectionChangedは行の値を変えても移動しても走らず。CurrentChangedとCurrentChangingは行を移動するとイベントが走る。
private void SelectedItemChanged(object sender, EventArgs e) { RaisePropertyChanged(nameof(GrandTotal)); RaisePropertyChanged(nameof(Balance)); }これで上(1円)から入力し、最後の行(10,000円)以外はきれいに連動。
10,000円の枚数を入力してから5,000円の行に戻るとちゃんと連動。
「仕様です」と言い張るか「最新の情報に更新」ボタンを付けるか?
スマホのショップアプリとかで依頼主いるような仕事だと許してもらえないでしょう?
xamarin shopping cartで検索したらMicrosoftさんにあった。
ModelとViewModel
合計値取得するのがプロパティじゃなくメソッドになっている。しかもLinq使わずforeach使ってる。
よりオフィシャルさのあるContosoApp。
こちらはシンプルなModelをラップしてからViewModelで使う場合の参考になりそう。
ObservableCollectionやListCollectionViewについては出納帳の方でまじめにやることにし、こちらはとりあえず仕様で済ます。
XAMLと戯れる
疲れた…。
数字をカンマ付きに変える
他に方法あるかも知れませんが一番最初に見つかったので…。<TextBlock Text="{Binding GrandTotal, StringFormat={}{0:N0}, Mode=OneWay}" …