2014年10月16日木曜日

AddNewした後、EndEditを呼ぶべし

DataTable/DataViewをWPFに対してバインドする場合、DataRowViewがくっ付きますよ、という話は以前致しました。

さて、見積もり作成ソフトHiramituで、新しい見積もりを作成(DataView.AddNew)します。次のように、EndEditを呼んで置かないと、WPFのバインドに変更が伝わらない、という事が起こるようです。

        private void m追加_Click(object sender, RoutedEventArgs e) {
            if (T1 == null) return;

            var form = new T見積INPUT();
            var rec = T1.View.AddNew();
            rec["作成日"] = DateTime.Today;
            rec["有効期限"] = DateTime.Today.AddDays(14);
            rec.EndEdit(); // <--- ここ!
            App.ParentCenter(form);
            form.T1 = T1;
            cvsItems.View.MoveCurrentTo(rec);
            if (form.ShowDialog() ?? false) {
                rec.EndEdit();
            }
            else if (FConfirm.Show("新しいのん削除するよ?") ?? false) {
                rec.Delete();
            }
            T1.Save1(rec);
        }


DataRowViewを変更したのに、WPFへ変更が伝わらない。。。想像の範囲ですが、IsEditが関連すると思います。

例とは異なるコードですが、実験しました所、こういうことでした。

            ((DataRowView)tb.DataContext).BeginEdit();
            ((DataRowView)tb.DataContext)["Value"] = new Random().Next() + "";
            ((DataRowView)tb.DataContext).EndEdit(); // ← ここで変更が通知される

または、編集中でない場合、つまり、BeginEditとEndEditを省略した場合、ただちに通知されます。

            ((DataRowView)tb.DataContext)["Value"] = new Random().Next() + ""; // ← ここで通知される