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

System.InvalidCastException转换无效报错及多产品对应页面跳转实现问题

问题解决方案

1. 报错原因分析

你触发类型转换异常的核心原因是:当前的Button是直接写在页面布局中,没有和MainViewModel的Products列表下的单个ProductViewModel条目绑定,按钮的BindingContext实际继承自页面的全局绑定上下文(也就是MainViewModel实例),强转成ProductViewModel自然会失败。

2. 修复步骤

2.1 修改NavigatePage.xaml

将原来的单个Button替换为集合控件遍历Products列表,这样每个生成的按钮的BindingContext就会自动对应单个ProductViewModel实例,示例代码如下:

<CollectionView ItemsSource="{Binding Products}" Grid.Row="2">
    <CollectionView.ItemsLayout>
        <!-- 和你原来的3列布局对应 -->
        <GridItemsLayout Orientation="Vertical" Span="3" />
    </CollectionView.ItemsLayout>
    <CollectionView.ItemTemplate>
        <DataTemplate>
            <Button BackgroundColor="#FB9B63" CornerRadius="10" HeightRequest="60" 
                    FontSize="20" HorizontalOptions="Center" Margin="8"
                    Text="Entrer" TextColor="White" VerticalOptions="Center" 
                    Clicked="AddToCartButton_Clicked" />
        </DataTemplate>
    </CollectionView.ItemTemplate>
</CollectionView>

同时确保NavigatePage的绑定上下文已经正确赋值,可在页面构造函数中添加:

BindingContext = new MainViewModel();

2.2 修改NavigatePage.xaml.cs点击事件

用安全转换代替强转,增加空校验避免空引用异常,同时补全所有产品对应的页面跳转分支:

private void AddToCartButton_Clicked(object sender, EventArgs e)
{
    var btn = sender as Button;
    var item = btn?.BindingContext as ProductViewModel;
    // 绑定上下文类型不匹配直接返回
    if (item == null) return;

    ContentPage page = null;
    switch (item.Name)
    {
        case "QR_Manager":
            page = new Views.ManagerPage();
            break;
        case "Yellow Sun":
            page = new Views.YellowSunPage();
            break;
        // 其余产品对应的页面分支按需求自行补充
        default:
            // 未匹配到对应页面时可加提示逻辑,此处直接返回避免空跳转
            return;
    }

    if(page != null)
        Navigation.PushAsync(page);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 10:36:04