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
相关产品推荐
相关产品推荐

