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

Xamarin.Forms页面打开时ViewModel方法被调用4次的原因排查

问题分析:ViewModel构造函数重复调用导致重复API请求

导航至DepoAktarımBarkodPage页面时,对应的DepoAktarımBarkodPageViewModel构造函数被执行4次,导致其中的GetDepoDetayForStokHareket()等方法重复发起4次API调用,引发业务异常。控制台重复输出4次belge no : ,证实构造函数被实例化了4次。

相关ViewModel代码

public class DepoAktarımBarkodPageViewModel : INotifyPropertyChanged
{   
    public DepoAktarımBarkodPageViewModel()
    {
        AddBarkodToMyList = new Command<string>(addBarkod);
        //BarkodgetirCommand = new Command(barkodGetir);
        StokPopUpOpenCommand = new Command(stokPopUpOpen);
        EvrakLineDeleteCommand = new Command(satirSil);
        ChangeTempMiktarCommand = new Command<string>(changeMyTempMiktar);
        ScannerOpenCommand = new Command(scannerOpen);
        GetResultCommand = new Command(async (r) => await GetScannedAsync(r));
        SelectTempBarkod = new Command<string>(SelectMyTempBarkod);
        SelectGRaf = new Command<string>(changeTempGRaf);
        SelectCRaf = new Command<string>(changeTempCRaf);
        OzetListeDoldur = new Command(OzetPageListDoldur);
        SerbestMikOpenCommand = new Command(serbestMikPopUpOpen);

        GetDepoDetayForStokHareket();
        changeMyTempMiktar("");
        fillRafLists();
        detectYeniStok();
        Console.WriteLine($"belge no : {belgeNO}");
    }
}

控制台输出

belge no : 
 belge no : 
 belge no : 
 belge no : 

可能成因

  • 导航逻辑重复触发:导航至该页面的代码被多次执行,比如按钮点击事件重复绑定、导航命令被多次订阅,每次导航都会新建ViewModel实例。
  • ViewModel实例化方式错误:
    • XAML中重复设置DataContext(比如同时在Page标签和后台代码OnNavigatedTo方法中赋值);
    • 依赖注入容器配置错误,将ViewModel注册为瞬态但被多次解析。
  • 页面生命周期事件重复触发:OnNavigatedTo等生命周期方法因页面栈操作异常、导航模式问题被触发4次,且每次触发都新建ViewModel实例。
  • XAML资源或绑定问题:XAML中多次引用该ViewModel作为资源,或者绑定路径错误导致框架自动多次创建实例。
  • 路由配置异常:路由规则设置不当,导致同一页面被多次匹配加载,进而重复实例化ViewModel。

内容的提问来源于stack exchange,提问作者Mert Altiparmak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 06:35:09