继承Catel.MVVM.ViewModel的视图模型未调用InitializeAsync问题排查
Catel.MVVM v5.12.22 中
InitializeAsync() 未触发的常见原因 - 未通过官方工厂实例化ViewModel
如果你直接通过new MyViewModel()的方式手动创建视图模型实例,Catel不会自动触发生命周期方法,必须使用IViewModelFactory创建实例,或者手动调用InitializeAsync()方法。 - 全局初始化开关被关闭
检查启动阶段的Catel配置,若设置了ViewModelConfiguration.SkipViewModelInitialization = true,所有视图模型都会跳过初始化流程,自然不会触发InitializeAsync()。 - 方法重写签名错误
必须严格匹配基类方法签名:protected override async Task InitializeAsync(),如果返回值、访问修饰符、参数存在差异,或者没有加override关键字,都会导致你写的方法不是对基类方法的重写,不会被生命周期调用。 - 生命周期前置步骤中断
若重写的同步初始化方法(如OnInitializing()、OnInitialized())中抛出未捕获的异常,会直接中断整个ViewModel生命周期流程,不会执行到后续的InitializeAsync()。 - 视图与ViewModel关联逻辑异常
在View自动绑定ViewModel的场景下,若ViewLocator或ViewModelLocator配置错误,导致Catel没有识别到View对应的ViewModel,或者你手动给View设置DataContext时没有走Catel的生命周期管道,也会跳过初始化方法调用。 - 子ViewModel未被正确管理
如果是嵌套场景下的子ViewModel,父ViewModel直接创建实例加入集合而没有通过IViewModelFactory创建,也没有手动触发初始化的话,子ViewModel的InitializeAsync()不会被调用。 - 自定义生命周期行为覆盖了默认逻辑
如果你实现了自定义的IViewModelInitializer、或者替换了Catel默认的ViewModel生命周期服务,可能因为自定义逻辑没有调用基类的初始化方法,导致InitializeAsync()被阻断。
内容的提问来源于stack exchange,提问作者juicebyjustin
相关产品推荐
相关产品推荐

