LoginSignup
3
4

More than 5 years have passed since last update.

Xamarin(C#)で、メンバ変数変更時に自動で値を表示するような事をやってみたかった。

Posted at

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

3
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4