Xamarin中如何在绑定外获取Customer数据 解决空引用报错问题
Xamarin Customer数据获取问题解决
报错原因
你在DetailProduct类中定义的Customer属性从未被赋值,默认值为null,直接访问Customer.NameUs就会触发空引用异常。你的ViewProductViewModel构造函数已经默认初始化了CustomerInfo属性,你可以直接从绑定的ViewModel中获取数据,也可以通过页面传参的方式传递已有的Customer实例。
解决方法1:直接从当前页面绑定的ViewModel中获取
将报错行的代码替换为如下内容即可:
// 先拿到绑定的ViewModel实例 var viewModel = (ViewProductViewModel)BindingContext; // 从ViewModel中获取CustomerInfo的NameUs字段 string name = viewModel.CustomerInfo.NameUs;
解决方法2:从前置商品列表页传递Customer实例
如果你的Customer数据是在商品列表页就已经获取到的,通过构造函数传参的方式更符合业务逻辑:
- 修改商品列表页的跳转代码,传入Customer实例:
private async void OnViewDetailProduct(ProductInfo prod) { // 这里的customer替换为你商品列表页已拿到的Customer实例 await Navigation.PushAsync(new DetailProduct(prod, customer)); }
- 修改
DetailProduct的构造函数,接收并处理Customer参数:
public DetailProduct(ProductInfo productInfo, Customer customer) { InitializeComponent(); NavigationPage.SetHasNavigationBar(this, true); var viewModel = new ViewProductViewModel(); // 将传过来的Customer赋值给ViewModel viewModel.CustomerInfo = customer; BindingContext = viewModel; if (productInfo != null) { // 直接使用传过来的Customer实例 string name = customer.NameUs; double countall = productInfo.AveragedID; viewModel.ProductInfo = productInfo; } }
补充说明
如果你只需要在XAML界面上展示NameUs字段,不需要写后台代码,直接绑定即可:
<Label Text="{Binding CustomerInfo.NameUs}" />
注意:当前ViewProductViewModel构造函数中初始化的CustomerInfo是空实例,NameUs默认值为null,如果需要填充真实业务数据,可在ViewModel中增加接口请求、本地缓存读取逻辑给CustomerInfo赋值即可。
内容的提问来源于stack exchange,提问作者Chim Di Tru
相关产品推荐
相关产品推荐

