Xamarin.Forms Picker点击即崩溃(特定机型)求助
Xamarin.Forms Picker点击崩溃(String转Sorte类型转换失败)解决方案
问题核心
三星、Google Pixel设备上Picker点击即崩溃,报错Invalid cast from 'System.String' to 'XXXXXXXXXXXXX.DataModel.Entities.Sorte',华为设备无异常;Picker需保留第一项为空的设计,数据来自不可修改的SQLite数据库。
解决步骤及代码修正
1. 统一ItemsSource类型,添加空Sorte实例
报错根源是Picker的ItemsSource中混入了System.String类型的空项,而非Sorte类型的空实例。在从SQLite加载数据后,需在集合头部添加空的Sorte对象,而非字符串"":
// 示例:加载OcSorten并添加空项 var dbSorten = await yourSqliteService.GetOcSortenAsync(); // 合并空项与数据库数据,确保集合全为Sorte类型 SelectedOrderItem.SelectedTaxItem.OcSorten = new List<Sorte> { null }.Concat(dbSorten).ToList();
2. 修正ViewModel的SelectedSorte逻辑
原代码存在拼写错误(SelectedTaxtem应为SelectedTaxItem),且未处理value为null的情况,导致空项选中时逻辑异常:
public Sorte SelectedSorte { get { return SelectedOrderItem?.SelectedTaxItem?.SelectedSorte; } set { // 修正拼写错误,同时允许设置null值 if (SelectedOrderItem?.SelectedTaxItem != null && value != SelectedOrderItem.SelectedTaxItem.SelectedSorte) { SelectedOrderItem.SelectedTaxItem.SelectedSorte = value; RaisePropertyChanged(); Validate(); } } }
3. 调整XAML绑定,明确空值处理
在Picker的绑定中指定空值对应的目标,避免类型不匹配:
<Picker x:Name="pickerSelectedSorte" ItemDisplayBinding="{Binding Description, TargetNullValue=''}" ItemsSource="{Binding SelectedOrderItem.SelectedTaxItem.OcSorten}" SelectedItem="{Binding SelectedSorte, Mode=TwoWay, TargetNullValue={x:Null}}" />
原因说明
不同品牌设备的原生Picker实现逻辑存在差异:华为设备可能兼容了ItemsSource中类型不一致的情况,而三星、Pixel的Picker对类型一致性要求更严格,当集合中存在字符串空项时,选中时会尝试将字符串强制转换为Sorte类型,直接引发崩溃。
内容的提问来源于stack exchange,提问作者Yves
相关产品推荐
相关产品推荐

