如何让ViewModel的GetProductStatus方法仅在按钮点击时调用
解决ViewModel方法自动执行的问题
当前问题的核心原因很直接:你在ViewModel的构造函数里直接调用了GetProductStatus(),导致ViewModel一实例化(页面加载时)就自动执行该方法。要实现仅在按钮点击时调用,按以下步骤修改:
1. 移除构造函数中的方法调用
删掉ViewModel构造函数里的GetProductStatus();,避免ViewModel加载时自动触发:
public ProductViewModel(INavigation nav, Store store) { _Nav = nav; // 移除这一行:GetProductStatus(); }
2. 在按钮点击事件中触发方法
修改页面的按钮点击事件,在导航到ProductPage后调用ViewModel的GetProductStatus():
private async void ProductTypeButton_Clicked(object sender, EventArgs e) { await Navigation.PushAsync(new ProductPage(_ViewModel)); // 调用ViewModel的方法 _ViewModel.GetProductStatus(); }
优化建议(可选)
- 把
GetProductStatus()的返回类型从async void改为async Task,普通异步方法用async Task更便于异常处理和后续扩展:
private async Task GetProductStatus() { try { IsBusy = true; var status = await ProductStatusService.GetProductStatus(new ProductStatus() { StoreCode = s_code, StartTime = StartDateValue.AddMinutes(time1), EndTime = StartDateValue.AddMinutes(time2) }); IsBusy = false; if (status != null) { // 处理逻辑 } else { // 数组为空的处理 } ProductStatus = status; } catch (Exception) { ProductStatus = null; } }
此时调用时需要用await:
private async void ProductTypeButton_Clicked(object sender, EventArgs e) { await Navigation.PushAsync(new ProductPage(_ViewModel)); await _ViewModel.GetProductStatus(); }
- 如果希望页面完全显示后再执行方法,可在ProductPage的
OnAppearing生命周期中调用,更符合MVVM解耦原则:
protected override async void OnAppearing() { base.OnAppearing(); var viewModel = BindingContext as ProductViewModel; viewModel?.GetProductStatus(); }
内容的提问来源于stack exchange,提问作者Raj
相关产品推荐
相关产品推荐

