Objective-CだとKVOに近い、「値が変わったら自動で反映させる」仕組みができないか遊んでました。
元はこれ
http://developer.xamarin.com/guides/android/user_interface/date_picker/
Andoridのサンプルで、DatePickerで設定した日付をTextFieldに反映していますが、この反映が関数呼び出しになるのでイマイチ感がありました。これをEventHandlerで出来ないか試しました。
using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
namespace HelloDatePicker
{
[Activity (Label = "HelloDatePicker", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity
{
private TextView dateDisplay;
private Button pickDate;
private DateTime _date; // 保存する日付の本体
private DateTime date { // ハンドラーを呼び出す偽日付
get{ return _date; }
set {
_date = value;
this.updateDateHandler (this, this.date);
}
}
private event EventHandler<DateTime> updateDateHandler;
// ハンドラ
protected override void OnCreate (Bundle savedInstanceState)
{
base.OnCreate (savedInstanceState);
SetContentView (Resource.Layout.Main);
// capture our View elements
dateDisplay = FindViewById<TextView> (Resource.Id.dateDisplay);
pickDate = FindViewById<Button> (Resource.Id.pickDate);
// add a click event handler to the button
pickDate.Click += delegate {
// ShowDialog (DATE_DIALOG_ID);
DatePickerDialog dialog = new DatePickerDialog (this, OnDateSet, date.Year, date.Month - 1, date.Day);
dialog.Show ();
};
// this.dateが変更されたらdateDisplayに反映するイベント登録
this.updateDateHandler += delegate(object sender, DateTime e) {
dateDisplay.Text = e.ToString ("d");
};
// get the current date
date = DateTime.Today;
}
// the event received when the user "sets" the date in the dialog
void OnDateSet (object sender, DatePickerDialog.DateSetEventArgs e)
{
// DatePickerDelegateで設定おされたら呼び出される
// this.dateを更新してるだけ。
this.date = e.Date;
}
}
}
変数本体と「見せかけのgetter/setter」が別々に出来てしまったのがちょっとアレです。ここもっと上手く書けそうな気がします。誰か教えて下さい m(_ _)m