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

