You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 14:16:12