Xamarin Forms中Picker如何基于Id而非选中索引设置默认值
Xamarin.Forms Picker 默认值设置与值绑定方案
一、基于Id/Name设置默认选中项
你的代码错误点在于:Picker.SelectedItem 必须接收与数据源类型完全一致的实例对象,你给它赋值字符串类型的Name属性无法生效。你可以直接从已绑定的ItemsSource中筛选匹配Id/Name的Team实例,赋值给SelectedItem即可,无需使用SelectedIndex。
修正后的构造函数代码如下:
public AddASessionPage(Session session) { InitializeComponent(); api = new TheHockeyLabMnHttpApi(); Session = session; BindPicker(); // 执行后pickTeam.ItemsSource已绑定Team类型列表 if (session != null) { txtName.Text = session.Name; // 方式1:按Team的Id匹配(推荐,避免重名问题,假设Session有关联字段TeamId) var teamList = pickTeam.ItemsSource as List<Team>; var targetTeam = teamList?.FirstOrDefault(t => t.Id == session.TeamId); // 方式2:按Team的Name匹配 // var targetTeam = teamList?.FirstOrDefault(t => t.Name == "目标团队名称"); pickTeam.SelectedItem = targetTeam; txtDateStartEntry.Text = session.StartDate.ToString(); // 原代码笔误修正:第二个赋值改为结束日期输入框 txtDateEndEntry.Text = session.EndDate.ToString(); } }
二、展示文本与实际存储值分开绑定
Xamarin.Forms Picker 原生支持该需求,对应ASP.NET中展示、取值分开绑定的两个属性为:
ItemDisplayBinding:绑定列表项对外展示的字段,你当前已配置为绑定Name属性SelectedValuePath:绑定你实际需要存储/读取的字段,比如要存Team的Id就配置为Id
修改后的XAML代码如下:
<Picker x:Name="pickTeam" ItemDisplayBinding="{Binding Name}" SelectedValuePath="Id"> </Picker>
配置完成后,直接读取pickTeam.SelectedValue即可拿到选中Team的Id值,无需再将SelectedItem强制转换为Team类型再取值。如果要设置默认选中,也可以直接给SelectedValue赋值对应Id,无需遍历数据源,示例:
// 直接选中Id为3的Team pickTeam.SelectedValue = 3;
内容的提问来源于stack exchange,提问作者dotnetdevcsharp
相关产品推荐
相关产品推荐

