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

DatePicker选择当日日期时DateSelected事件不触发问题求助

问题分析

核心问题有两个:

  1. DateSelected事件触发条件限制:该事件仅在选中日期与DatePicker当前绑定的Date值不同时才会触发。如果ViewModel初始化时MDate设为当日(如DateTime.Today或DateTime.Now.Date),用户再次选择当日时,因值未发生变化,事件不会执行,导致弹窗无法关闭。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 19:50:25