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

Xamarin Forms中如何从XAML向C#构造函数传递自定义类对象参数

解决方案

首先明确:XAML中直接声明自定义控件时默认只能调用无参构造函数,无法直接传入自定义类对象作为构造参数,你可以选择以下两种常用方案实现需求:

方案1:后台代码初始化CarouselView子项(最适配你的现有写法)

步骤1:修改父页面XAML,移除硬编码的ItemsSource

<CarouselView x:Name="carouselView" 
              VerticalOptions="FillAndExpand" 
              HorizontalOptions="FillAndExpand" 
              Loop="False">
    <CarouselView.ItemTemplate>
        <DataTemplate>
            <ContentView Content="{Binding .}" />
        </DataTemplate>
    </CarouselView.ItemTemplate>
</CarouselView>

步骤2:修正ContentView构造函数的笔误(你的现有代码存在类名和构造函数名不匹配问题)

public partial class CompanyView : ContentView
{
    // 构造函数名要和类名一致,原代码写的CompanyTabView是错误的
    public CompanyView(Models.Company companyItem)
    {
        InitializeComponent();
        Debug.WriteLine($"Company Name: {companyItem.Name}");
    }
}
// DetailView、LocationView同理修改构造函数

步骤3:父页面后台构造函数中初始化子项并传参

public partial class ParentPage : ContentPage
{
    CompanyDetailPageViewModel CompanyDetailPageVM;
    List<ContentView> CompanyTabViews = new List<ContentView>();

    public CompanyDetailPage(Models.Company.Company companyItem)
    {
        InitializeComponent();
        // 手动创建各子ContentView实例,直接传入构造参数
        CompanyTabViews.Add(new CompanyView(companyItem));
        CompanyTabViews.Add(new DetailView(companyItem)); // 其他子View同理传参
        CompanyTabViews.Add(new LocationView(companyItem));
        // 赋值给CarouselView的ItemsSource
        carouselView.ItemsSource = CompanyTabViews;
    }
}

方案2:使用依赖属性绑定传参(适配MVVM架构场景)

如果不想通过构造函数传参,可以给自定义ContentView添加依赖属性,通过绑定上下文传递参数:

步骤1:给CompanyView添加依赖属性

public partial class CompanyView : ContentView
{
    public static readonly BindableProperty CompanyItemProperty = 
        BindableProperty.Create(nameof(CompanyItem), typeof(Models.Company), typeof(CompanyView), propertyChanged: OnCompanyItemChanged);

    public Models.Company CompanyItem
    {
        get => (Models.Company)GetValue(CompanyItemProperty);
        set => SetValue(CompanyItemProperty, value);
    }

    public CompanyView()
    {
        InitializeComponent();
    }

    private static void OnCompanyItemChanged(BindableObject bindable, object oldValue, object newValue)
    {
        if (newValue is Models.Company company)
        {
            var view = (CompanyView)bindable;
            Debug.WriteLine($"Company Name: {company.Name}");
            // 这里执行初始化逻辑
        }
    }
}

步骤2:父页面绑定参数

给父页面设置BindingContext为接收的companyItem,之后在XAML中绑定属性即可:

<carouselViews:CompanyView CompanyItem="{Binding .}" />

内容的提问来源于stack exchange,提问作者Junaid Pathan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 15:57:02