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

.NET MAUI中Picker值传递给ICommand仅获01/01/1900问题排查

问题分析与修复方案

你的代码存在三个核心问题,导致无法正确获取Picker的选中日期:


1. 命令未关联处理逻辑

SelectedMesi命令仅做了声明,但没有绑定到实际的处理方法,相当于命令触发后没有执行任何有效操作。

2. 处理方法逻辑完全无效

SelectedIndexChangeMese方法里执行的DataScelta = datascelta,只是把默认的DateTime.MinValue(即01/01/1900)重新赋值给自己,完全没有读取Picker的选中值。

3. EventToCommandBehavior参数配置错误

  • CommandParameter="SelectedItem"是无效的字符串字面量,无法获取Picker的选中项;
  • SelectedIndexChanged事件的EventArgs本身不包含选中项信息,使用EventArgsConverter也无法拿到目标值。

修正后的完整代码

ViewModel 部分(需继承INotifyPropertyChanged)

private DateTime _dataScelta;
public DateTime DataScelta
{
    get => _dataScelta;
    set
    {
        if (_dataScelta != value)
        {
            _dataScelta = value;
            OnPropertyChanged();
        }
    }
}

public ICommand SelectedMesi { get; }
public List<DateTime> Month { get; set; }

public YourViewModel()
{
    // 初始化命令,绑定到处理方法
    SelectedMesi = new RelayCommand<object>(OnMonthSelected);
    
    // 示例:初始化月份列表(根据你的实际数据源调整)
    Month = Enumerable.Range(0, 12)
                     .Select(i => DateTime.Now.AddMonths(-i))
                     .ToList();
}

private void OnMonthSelected(object selectedItem)
{
    if (selectedItem is DateTime selectedDate)
    {
        DataScelta = selectedDate;
        // 可添加验证逻辑,比如打印确认
        Debug.WriteLine($"选中日期:{DataScelta:yyyy-MM-dd}");
    }
}

XAML 部分

调整命令参数绑定,直接传递Picker的SelectedItem:

<Picker
    HeightRequest="40"
    WidthRequest="150"
    Grid.Row="1" Grid.Column="1"
    BackgroundColor="Beige"
    HorizontalOptions="Center"
    HorizontalTextAlignment="Center"
    Title="Seleziona Il Mese"
    ItemsSource="{Binding Month}"
    IsVisible="{Binding visible}"
    x:Name="MonthPicker">
    <Picker.Behaviors>
        <mct:EventToCommandBehavior
            EventName="SelectedIndexChanged"
            Command="{Binding SelectedMesi}"
            CommandParameter="{Binding Source={x:Reference MonthPicker}, Path=SelectedItem}"/>
    </Picker.Behaviors>
</Picker>

更简洁的替代方案:直接绑定SelectedItem

无需使用EventToCommandBehavior,直接通过双向绑定关联Picker的选中项和ViewModel属性:

XAML

<Picker
    HeightRequest="40"
    WidthRequest="150"
    Grid.Row="1" Grid.Column="1"
    BackgroundColor="Beige"
    HorizontalOptions="Center"
    HorizontalTextAlignment="Center"
    Title="Seleziona Il Mese"
    ItemsSource="{Binding Month}"
    IsVisible="{Binding visible}"
    SelectedItem="{Binding DataScelta, Mode=TwoWay}"/>

ViewModel

只需保留可绑定的DataScelta属性,选中变化时自动更新:

private DateTime _dataScelta;
public DateTime DataScelta
{
    get => _dataScelta;
    set
    {
        if (_dataScelta != value)
        {
            _dataScelta = value;
            OnPropertyChanged();
            // 选中后的业务逻辑可在此处添加
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 07:40:32