前回からの続きです。
WPFと戦った記録 ⑴【MVVM】 - プログラミングと日々思ったことなど
↑こちらが前回の記事になります。
今回はViewModelから復習していきます。
まずはコードから(前回に引き続き、コードは省略している部分があります)
KyukaViewModel.cs
ViewModelにて、BindやCommandの処理をコーディングしていきます。
!DTO
データベースからデータを取ってきた際に、データを入れる箱がDTOです。
DTOがあれば直接データベースに接続しなくて良くなります。
(今回のDTOにはkyuka_divisionという名前の箱があります)
using System; using ...略; namespace WpfViewBaseprj.ViewModels { public class KyukaViewModel : Commons,ViewModelBase { //件数表示変数 private string stCount = string.Empty; //登録・更新結果を保存する変数 private bool isSuccess = false; //Viewsフィールド BindingListCollectionView views; public BindingListCollectionView Views { get{return views;} set { views = value; this.RaisePropertyChanged("Views"); } } //データ取得用 private DataSet cmnDs; public DataSet CmnDs { get{return cmnDs;} set{cmnDs = value;} } //Dtoフィールド private WpfViewBaseprjDTOetc.Dto.DtoKyuka dto; public WpfViewBaseprjDTOetc.Dto.DtoKyuka Dto { get{return dto;} set { dto = value; this.RaisePropertyChanged("Views"); } } //Model設定 private KyukaModel kyukaModel; public KyukaModel KyukaModel { get{ return Kyukamodel; } set { kyukaModel = value; this.RaisePropertyChanged("Kyukamodel"); } } //コンストラクタ public BindingListCollectionView ListViews{get; set;} public DataRow dr; //休暇届新規登録用コンストラクタ public KyukaViewModel(DataSet commonDs,System.Widows.Forms.ComboBox cmb) { this.Dto = dto; dto = new DtoKyuka(); this.cmb = commonDs; this.Kyukamodel = new kyukaModel(); dto.kyuka_division.Addkyuka_divisionRow(dto.kyuka_division.Newkyuka_divisionRow()); DtoKyuka.kyuka_divisionRow conRow = (DtoKyuka.kyuka_divisionRow)dto.kyuka_division.Rows[0]; //コンボボックス設定 conRow.sinsei_year = DateTime.Now.Year.Tostring(); conRow.sinsei_month = string.Format("{0:D2}",DateTime.Now.Month); conRow.sinsei_day = ...略; this.Views = new BindingListCollectionView(Dto.kyuka_division.DefaultView); //バインド用データ設定 this.InitBindingData(); //画面クローズ・項目チェックコマンド this.CloseCommand = new RelayCommand<Window>(this.CloseWindow); } //休暇届更新画面用コンストラクタ public KyukaViewModel(DataSet commonDs,System.Windows.Forms.ComboBox cmb,DataRow dataRow) { this.Dto = dto; this.cmnDs = commonDs; this.kyukaModel = new kyukaModel(); this.Dto = kyukaModel.test(dataRow); this.Views = new BindingListCollectionView(Dto.kyuka_division.DefaultView); this.InitBindingData(); this.CloseCommand = new RelayCommand<Window>(this.CloseWindow); } //バインド用データ設定 public void BindingData(string hazimari) { switch(hazimari) { case"shinsei": Days = keisansuru(SelectNen,SelectMonth); break; case"from": Days2 = keisansuru(SelectNen2,SelectMonth2); break; } } //コンボボックスメソッド(年月日を作る) public void Tosituki() { DataTable tosi = new DataTable(); tosi.Columns.Add("tosinum"); tosi.Columns.Add("tosi"); //データテーブルに入れるRowをセット for(int year = 2017;year <=2020 ; year++) { DataRow dr = tosi.NewRow(); tosi.Rows.Add(dr); dr["tosinum"]=year; dr["tosi"]=year; } Nen = tosi; //月設定は省略 //初期値設定 SelectNen = DateTime.Now.Year; SelectMonth = DateTime.Now.Month; SelectDay = DateTime.Now.Day; SelectNen2 = DateTime.Now.Year; SelectMonth2 = DateTime.Now.Month; SelectDay2 = DateTime.Now.Day; } //ラベル設定 public string TopTitle { get{return "休暇届";} } //コンボボックスプロパティ private DataTable nen; public DataTable Nen { get{return nen;} set { nen = value; this.RaisePropertyChanged("Nen"); } } private int selectNen; public int SelectNen; { ...略 } //バインド用日付計算設定 public DataTable keisansuru(int year,int month) { var dt = new DataTable(); int days= DateTime.DaysInMonth(year,month); dt.Columns.Add("id"); dt.Columns.Add("days"); for(int idx=1; idx<=days ; idx++) { DataRow dr = dt.NewRow(); dt["id"] = string.Format("{0:D2}",idx); dt["days"] = string.Format("{0:D2}",idx); dt.Rows.Add(dr) } return dt; } //コマンド public RelayCommand<window> CloseCommand { get; private set; } private void CloseWindow(Window window) { if(window is Entry) { bool ab = false; foreach(System.Windows.Controls.RadioButton rb in ((Entry)window).panel.Children) { if((bool)rb.IsChecked) { ab = true; break; } } if(!ab) { System.Windows.MessageBox.Show("入力項目を確認してください",MessageBoxButton.OK); return; } ((KyukaViewModel)((Entry)window).DataContext).btnSave_Click(); } if((window !=null)&&(isSuccess)) { window.Close(); } } //継承メソッド(ViewModelBaseから継承されたメソッド) public override void btnSave_Click() { KyukaModel kyukaModel = new KyukaModel(this.Dto); kyukaModel.InsertData(); } } }
コンボボックスを分岐させているのは、年月日を記入する項目が3つあるからです。
年月日は1つのコンボボックスではなく、3つのコンボボックス(年と月と日)に分かれています。
また画面上で記入した項目は、ModelからデータベースへInsert・・・ではなく、ModelからFa、インターフェース、最終的にDaoからデータベースへ接続しました。
そして接続して取得したデータを、DTOに入れます。
KyukaModel.cs
using ...略; //休暇届更新画面用 public WpfViewBaseprjDTOetc.Dto.DtoKyuka test(DataRow dr) { WpfViewBaseprjDTOetc.Dto.DtoKyuka testdesu = null; Service = new WpfViewBaseControlLogic.Service.FaKyuka(); testdesu = Service.Gettest(this.dto,dr); return testdesu; }
Modelは、ViewModelで処理しないもの(データベースなど)の処理、管理です。
ViewModelは画面のバインド部分を変更させる処理を主にさせ、Modelはデータベースなどの処理、管理をさせます。
以上です。
・・・うーん。これで良いのか不安です。
まだまだ勉強不足です。がんばります。