.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
相关产品推荐
相关产品推荐

