XML 上的 Xamarin Android DatePicker。如何触发事件以设置在 DatePicker 上选择的时间?

Xamarin Android DatePicker on XML. How do I fire a event to set time that is selected on DatePicker?

我正在使用 xml 开发一个 xamarin android 项目,我有一个日期选择器,我想在 xml 上使用我如何为下面的日期选择器触发事件是我的 xml DatePicker 代码:

    <DatePicker
        android:id="@+id/DatePicker"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:datePickerMode="spinner"
        android:calendarViewShown="false" />

Activity代码:

    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        SetContentView(Resource.Layout.ChangeDateTime);
        hour = DateTime.Now.Hour;
        minute = DateTime.Now.Minute;
        date = DateTime.Now;
        DateTime newDateTime;
        Vm.CurrentTime = hour.ToString() + minute.ToString();
        TimePicker.CurrentHour = (Java.Lang.Integer)DateTime.Now.Hour;
        TimePicker.CurrentMinute = (Java.Lang.Integer)DateTime.Now.Minute;

        TimePicker.TimeChanged += delegate (object sender, TimePicker.TimeChangedEventArgs e)
        {
            Vm.CurrentTime = e.HourOfDay.ToString() + e.Minute.ToString();

        };

        DatePicker.DateTime = DateTime.Now;
    }

我知道您可以使用 TimePicker 为 TimePicker.TimeChanged 做一个委托,但是对于 DatePicker 呢?

如果屏幕上有按钮,您实际上可以像下面这样使用点击事件:

SomeButton.Click += (sender, e) =>
{
    //Do your action here

}

好的,这(对于 .NET)的工作方式有点奇怪,但正如 Android 设计的那样。

当您调用 DatePicker 的 de Init 方法时,您传递一个 IOnDateChangedListener,并在已实现接口的 OnSelectedDayChange 函数上处理它。

如果您不自己设置委托,通常 Xamarin 实现有一个较弱的委托来处理事件,但在这种情况下,因为 Init() 方法已经需要此接口,并且假设您将始终调用该方法为了初始化日期,他们没有实现弱委托,因此没有事件。

 private EditText  _txtdob;
 DatePickerDialog _datePickerDialog;
 protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        SetContentView(Resource.Layout.sign_up);
        _txtdob.Focusable = false;
        _txtdob.Click += (sender, e) =>
        {
            _datePickerDialog.Show();
        };

        _datePickerDialog = new DatePickerDialog(this, (sender, args) =>
        {
            _txtdob.Text = args.Date.ToString("dd/MM/yyyy");
            ViewModel.NewUser.DOB = args.Date.Date;
        }, 
        DateTime.Now.Year, DateTime.Now.Month - 1, DateTime.Now.Day);
}

Here the _datePickerDialog when clicked will take the default date for today and when user selects other date it changes to the date selected by user. Here ViewModel.NewUser.DOB = args.Date.Date; line of code takes the new date selected by user where NewUser is a property in viewmodel creating a new User with UserDto and DOB is the datetime property in UserDto.