You need to enable JavaScript to run this app. CollectionView内嵌Picker无法获取选中值如何传递到数据库?
优惠活动
大模型
产品
解决方案
定价
更多

CollectionView内嵌Picker无法获取选中值如何传递到数据库?

问题根源

你当前把SelectedTimes属性定义在了全局ViewModel中,而CollectionView每一项的绑定上下文是单个RepeatMonthly对象,Picker的选中状态是每个星期项独立的,不能共用全局的选中属性,所以绑定时找不到对应属性,自然无法拿到每一项的选中时间。

修复步骤

1. 修改RepeatMonthly类,新增项独立的选中时间属性

给每个RepeatMonthly实例单独加选中时间属性,同时实现属性变更通知:

// 如果没有继承ObservableObject,自行实现INotifyPropertyChanged接口即可
public class RepeatMonthly : ObservableObject 
{
    public string Day { get; set; }
    public bool Selected { get; set; }
    public List<WalkTimes> _ListTimes { get; set; }

    private WalkTimes _selectedTime;
    public WalkTimes SelectedTime
    {
        get => _selectedTime;
        // 没有SetProperty方法就替换为你自己的属性通知逻辑
        set => SetProperty(ref _selectedTime, value); 
    }
}

2. 修改XAML中Picker的绑定

将Picker的SelectedItem绑定改为指向当前RepeatMonthly项的SelectedTime属性,开启双向绑定:

<Picker x:Name="SelectTimeOfWalkPicker" 
        Title="--Select Walk Start Time--" 
        Grid.Column="1" 
        ItemsSource="{Binding _ListTimes}" 
        ItemDisplayBinding="{Binding Value}" 
        VerticalTextAlignment="Center" 
        HorizontalTextAlignment="Center" 
        SelectedItem="{Binding SelectedTime, Mode=TwoWay}" />

3. 修改提交逻辑,直接取每一项的选中时间

提交时遍历判断选中的项,直接取对应SelectedTime的属性值即可,注意加空判防止用户未选时间:

private async void SubmitBtn_Clicked(object sender, EventArgs e)
{
    var vm = BindingContext as CreateWeeklyScheduleViewModel;
    foreach (RepeatMonthly booking in vm.DayList)
    {
        if (booking.Selected && booking.SelectedTime != null)
        {
            await passtoDataBase(booking.Day, booking.SelectedTime.Value);
        }
    }
    
    await DisplayAlert("Success", "Booked Successfully", "OK");
    await Shell.Current.GoToAsync($"//{nameof(MyBookingsPage)}");
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 16:33:02