Mvvm 在子视图模型上不调用OnInitialize和OnActivate

Mvvm 在子视图模型上不调用OnInitialize和OnActivate,mvvm,caliburn.micro,Mvvm,Caliburn.micro,我期望从屏幕继承的子视图模型将参与父屏幕的生命周期。然而,情况似乎并非如此。例如: public class ParentViewModel : Screen { public ChildViewModel Child { get; set; } public ParentViewModel(ChildViewModel childViewModel) { this.Child = childViewModel; } public ov

我期望从屏幕继承的子视图模型将参与父屏幕的生命周期。然而,情况似乎并非如此。例如:

public class ParentViewModel : Screen
{
    public ChildViewModel Child { get; set; }

    public ParentViewModel(ChildViewModel childViewModel)
    {
        this.Child = childViewModel;
    }

    public override void OnInitialize() { // called - as expected }

    public override void OnActivate() { // called - as expected }

    public override void OnDeactivate() { // called - as expected }
}

public class ChildViewModel : Screen
{
    public override void OnInitialize() { // not called - why? }

    public override void OnActivate() { // not called - why? }

    public override void OnDeactivate() { // not called - why? }
}

是否可以让子屏幕参与父屏幕的生命周期?

似乎这种行为不是默认行为,必须告诉父屏幕使用
ConductWith
方法“执行”子视图模型,如下所示:

public class ParentViewModel : Screen
{
    public ChildViewModel Child { get; set; }

    public ParentViewModel(ChildViewModel childViewModel)
    {
        this.Child = childViewModel;

        Child.ConductWith(this);
    }
}

这确保了ChildViewModel将与父对象同时初始化、激活和停用。如果只需要初始化/激活子项,则可以使用
ActivateWith
方法。

另一个选项是将父项设置为类型,并将子项设置为活动项。

其他解决方案是使用

protected override void OnViewAttached(object view, object context)

我没有想到OnActivated()

而是想到了这一点,但让每一个父VM都成为导体似乎有点过于苛刻。尽管如此,它可能会起作用。要支持多个子视图模型,必须使用
Conductor.Collection.AllActive