前提・実現したいこと
MVVMモデルのWPFでアプリ開発を始めたばかりの初心者なのですが、日付入力のUserControl作成の仕様でどう実現したらいいか悩んでいることがあります。
具体的には、
元号(西暦、和暦)ComBobox
年入力TextBox
月入力TextBox
日入力TextBox
現時点での年齢を表示するLabel
があるUserControlを作成するうえで
1.すべての項目に入力された際、内部的に持っているDateTimeデータを更新し、年齢計算をしてViewに反映
2.VM側とBindingしているのはそのDateTimeのプロパティーのみ
3.未入力状態では元号ComboBoxは西暦をデフォルトで選択
4.VM側から初期値としてDateTimeをセットした場合は和暦としてViewに表示する
といった要件です。ソースは一部ですが、現在の状態を張りました
こういった仕様の場合どういう実装方法が考えられるか教えていただけないでしょうか。
よろしくお願いします。
発生している問題・エラーメッセージ
VM側から初期値としてデータ更新された場合と、ユーザーがViewから入力してデータ更新された場合の判別方法がわからず、Viewで入力された場合に西暦で入力をしても自動的に和暦表示になってしまう
該当のソースコード
C#
1// Dateデータソース 2public static readonly DependencyProperty DateProperty = 3 DependencyProperty.Register( 4 "Date", 5 typeof(DateTime), 6 typeof(UC_Hoge), 7 new FrameworkPropertyMetadata(DateTime.MinValue, SetDateToView) { BindsTwoWayByDefault=true } 8 ); 9public DateTime Date 10{ 11 get { return (DateTime)GetValue(DateProperty); } 12 set { SetValue(DateProperty, value); } 13} 14 15protected static void SetDateToView(DependencyObject d, DependencyPropertyChangedEventArgs e) 16{ 17 if (e.OldValue != e.NewValue) 18 { 19 DateTime datetime = (DateTime)e.NewValue; 20 UC_Hoge view = d as UC_Hoge; 21 22 if (view != null) 23 { 24 string nYearEra = GetJEraName(datetime);// 和暦元号を取得 25 string nYearString = GetJEraYear(datetime);// 和暦年を取得 26 27 if (string.IsNullOrEmpty(nYearEra) == false && string.IsNullOrEmpty(nYearString) == false) 28 { 29 SetSelectedEraItem(view, nYearEra); // 和暦元号をセット 30 view.Year = nYearString; // 和暦年をセット 31 } 32 else 33 { 34 view.Year = (datetime.Year).ToString(); // 西暦年をセット 35 } 36 view.Month = (datetime.Month).ToString(); 37 view.Day = (datetime.Day).ToString(); 38 DateUtil birth = new DateUtil(datetime); 39 view.Age = birth.GetAgeString(); 40 } 41 } 42} 43// 年(月、日も同様の実装) 44public static readonly DependencyProperty YearProperty = 45 DependencyProperty.Register( 46 "Year", 47 typeof(string), 48 typeof(UC_Hoge), 49 new FrameworkPropertyMetadata(null, SetDateFromView) { BindsTwoWayByDefault = true } 50 ); 51public string Year 52{ 53 get { return (string)GetValue(YearProperty); } 54 set { SetValue(YearProperty, value); } 55} 56 57// 内容変更時の内部DateTime変更、年齢計算 58protected static void SetDateFromView(DependencyObject d, DependencyPropertyChangedEventArgs e) 59{ 60 UC_Hoge view = d as UC_Hoge; 61 62 if (view != null) 63 { 64 view.Age = null; 65 66 // 全ての値がセットされている場合年齢計算とDateの更新を行う 67 if ( 68 view.SelectedEraItem != null && 69 string.IsNullOrEmpty(view.Year) == false && 70 string.IsNullOrEmpty(view.Month) == false && 71 string.IsNullOrEmpty(view.Day) == false 72 ) 73 { 74 view.Date = view.MakeDate(view.SelectedEraItem.EraName, view.Year, view.Month, view.Day); // Viewの入力データからDateTimeを生成、Dateにセット 75 DateTime today = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1); // 当月1日時点でのDateTimeを取得 76 view.Age = new DateUtil(view.Date).GetAgeString(today); // 当月1日時点での年齢をセット 77 } 78 } 79} 80 81
試したこと
Viewの変更によるDateの更新の場合、和暦に強制変換しないようなフラグを用意してセットしてみるという方法を試しましたがうまくいきませんでした。
補足情報(FW/ツールのバージョンなど)
Microsoft Visual Studio 2017 v15.9.4
Prism.wpf v6.3.0
回答2件
あなたの回答
tips
プレビュー