如何获取自定义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
相关产品推荐
相关产品推荐

