You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取自定义DatePicker值并保存至Firebase数据库(保留占位符)

问题解决步骤

1. 修正自定义DatePicker的BindableProperty实现

你当前的BirthdayDatePickerControl存在BindableProperty命名与属性不匹配、未正确绑定的问题,修改后代码如下:

public class BirthdayDatePickerControl : DatePicker
{
    // 绑定属性命名与Placeholder对应,确保XAML能正常绑定
    public static readonly BindableProperty PlaceholderProperty = 
        BindableProperty.Create(nameof(Placeholder), typeof(string), typeof(BirthdayDatePickerControl), defaultValue: "Birth Date");

    // 正确绑定到BindableProperty,实现属性的通知机制
    public string Placeholder
    {
        get => (string)GetValue(PlaceholderProperty);
        set => SetValue(PlaceholderProperty, value);
    }
}

注:如果DatePickerCtrl没有实际用途,建议直接删除,避免冗余代码

2. 修复Android渲染器的逻辑问题

原渲染器直接强制设置Control.Text = "Birth Date"会覆盖用户选择的日期,需要改为仅在用户未选择日期时显示占位符:

[assembly: ExportRenderer(typeof(BirthdayDatePickerControl), typeof(BirthdayDatePickerRenderer))]
namespace YourNamespace.Droid
{
    public class BirthdayDatePickerRenderer : DatePickerRenderer
    {
        public BirthdayDatePickerRenderer(Context context) : base(context)
        {
        }

        protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.DatePicker> e)
        {
            base.OnElementChanged(e);

            if (Control != null && e.NewElement != null)
            {
                var customPicker = (BirthdayDatePickerControl)e.NewElement;
                // 初始加载时根据日期状态更新显示文本
                UpdateDisplayText(customPicker);
                // 监听日期变化事件,实时更新显示
                customPicker.DateChanged += OnDateChanged;
            }
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing && Element != null)
            {
                ((BirthdayDatePickerControl)Element).DateChanged -= OnDateChanged;
            }
            base.Dispose(disposing);
        }

        private void OnDateChanged(object sender, DateChangedEventArgs e)
        {
            UpdateDisplayText((BirthdayDatePickerControl)sender);
        }

        private void UpdateDisplayText(BirthdayDatePickerControl picker)
        {
            // 判断是否为默认日期(Xamarin.Forms DatePicker默认值为DateTime.Today)
            if (picker.Date == DateTime.Today)
            {
                Control.Text = picker.Placeholder;
                // 可选:设置占位符文本为灰色,区分正常选中值
                Control.SetTextColor(Android.Graphics.Color.Gray);
            }
            else
            {
                // 用控件设置的格式显示选中的日期
                Control.Text = picker.Date.ToString(picker.Format);
                Control.SetTextColor(Android.Graphics.Color.Black);
            }
        }
    }
}

3. 正确获取并保存日期值

原代码使用entryField_DateOfBirth.ToString()会返回控件的类型字符串,而非选中日期,需直接获取Date属性并转换为合适格式:

async public void signButton_Clicked(System.Object sender, System.EventArgs e)
{
    // 根据Firebase要求的格式转换日期,示例为短日期格式
    string dateOfBirth = entryField_DateOfBirth.Date.ToShortDateString();
    // 若需ISO标准格式,可改为:entryField_DateOfBirth.Date.ToString("yyyy-MM-dd")

    CUSTOMER customer = new CUSTOMER();
    customer.CusBirthOfDate = dateOfBirth;
    var Savedata = await customerRepo.Save(customer);
}

补充:如果需要校验用户是否真的选择了生日(而非默认的今日),可在保存前判断entryField_DateOfBirth.Date == DateTime.Today,若成立则提示用户选择生日。

内容的提问来源于stack exchange,提问作者helloFriend

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 17:20:27