DatePicker选择当日日期时DateSelected事件不触发问题求助
问题分析
核心问题有两个:
- DateSelected事件触发条件限制:该事件仅在选中日期与DatePicker当前绑定的
Date值不同时才会触发。如果ViewModel初始化时MDate设为当日(如DateTime.Today或DateTime.Now.Date),用户再次选择当日时,因值未发生变化,事件不会执行,导致弹窗无法关闭。 - ViewModel属性变更通知错误:
OnPropertyChanged(nameof(_mDate))传递的是字段名而非属性名MDate,会导致UI无法正确响应属性更新,出现选完日期后界面不刷新的问题。
解决方案
方案一:用Unfocused事件补充触发弹窗关闭
给DatePicker添加失去焦点事件,确保用户无论是否选择当日,只要完成选择操作就能关闭弹窗:
后台代码修改
private async void queryDatePicker_DateSelected(object sender, DateChangedEventArgs e) { await PopupNavigation.Instance.PopAsync(); } // 添加失去焦点事件处理 private async void queryDatePicker_Unfocused(object sender, FocusEventArgs e) { // 避免重复关闭弹窗 if (PopupNavigation.Instance.PopupStack.Any()) { await PopupNavigation.Instance.PopAsync(); } }
XAML修改
<DatePicker Margin="0, 20, 0, 0" Date="{Binding MDate}" DateSelected="queryDatePicker_DateSelected" Unfocused="queryDatePicker_Unfocused" x:Name="queryDatePicker" TextColor="Black" FontSize="Medium" BackgroundColor="#4DC6C7" />
方案二:MVVM友好的弹窗关闭方式
通过消息通知在ViewModel中触发弹窗关闭,同时修正属性变更通知的错误:
ViewModel修改
private DateTime _mDate = DateTime.Now; public DateTime MDate { get { return _mDate; } set { if (_mDate == value) return; // 避免重复执行逻辑 _mDate = value; OnPropertyChanged(nameof(MDate)); // 修正为属性名,确保UI更新 string queryParameter = Preferences.Get("queryParameters", ""); string pid = reportsParameters.PID; string output = _mDate.ToString("yyyyMMdd"); queryParameter += output + pid + ";;"; Preferences.Set("queryParameters", queryParameter); Console.WriteLine(queryParameter); // 发送关闭弹窗的消息 MessagingCenter.Send(this, "CloseDatePickerPopup"); } }
后台页面订阅消息
public YourPopupPage() { InitializeComponent(); // 订阅关闭弹窗的消息 MessagingCenter.Subscribe<YourViewModel>(this, "CloseDatePickerPopup", async (sender) => { await PopupNavigation.Instance.PopAsync(); }); } // 页面销毁时取消订阅,防止内存泄漏 protected override void OnDisappearing() { base.OnDisappearing(); MessagingCenter.Unsubscribe<YourViewModel>(this, "CloseDatePickerPopup"); }
注意事项
- 优先选择方案二,符合MVVM设计模式,避免后台代码与UI逻辑过度耦合;
- 必须修正ViewModel中
OnPropertyChanged的参数错误,否则选完日期后界面无法同步更新。
内容的提问来源于stack exchange,提问作者Mert Altiparmak
相关产品推荐
相关产品推荐

