初めてのWPF 13日目

2019/02/13 WPF::Prism

GrandTotalを連動させたい

GrandTotalの表示

一番左側のボックスができれば後は楽勝ですが、子コレクションのメンバーのプロパティの変化(グリッド中の「個数/枚数」が変わった時)をViewModel側で取得するにはどうするのがいいのか分からない。
Web版MVVMだとこんなイメージ
非常に基本的な機能だと思うのですが、基本的過ぎてかサンプル見つけられず。

公式ドキュメント(いつの間にかlegacyの下に)みながらListをObservableCollectionに変え、MoneyCountのセッターでプロパティ名を外してみても、プロパティの変更が受け取れず。
OnPropertyChanged();
更にドキュメントに従いListCollectionViewでラップして見たらイベントは3つだけ。
ListCollectionViewEvent010.png

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さんにあった
ModelViewModel
合計値取得するのがプロパティじゃなくメソッドになっている。しかもLinq使わずforeach使ってる。

よりオフィシャルさのあるContosoApp
こちらはシンプルなModelラップしてからViewModelで使う場合の参考になりそう。

ObservableCollectionやListCollectionViewについては出納帳の方でまじめにやることにし、こちらはとりあえず仕様で済ます。

XAMLと戯れる

TextBox010.png

疲れた…。

数字をカンマ付きに変える

他に方法あるかも知れませんが一番最初に見つかったので…。
<TextBlock Text="{Binding GrandTotal, StringFormat={}{0:N0}, Mode=OneWay}" …
OK キャンセル 確認 その他