プログラミングと日々思ったことなど

ブログ名通りです。仕事でプログラミングをはじめました。

WPFと戦った記録 ⑵【MVVM】

前回からの続きです。

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はデータベースなどの処理、管理をさせます。


以上です。


・・・うーん。これで良いのか不安です。
まだまだ勉強不足です。がんばります。