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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 02:05:23