OnInitialize и OnActivate не вызываются на дочерние модели просмотра

Я ожидал, что дочерние модели просмотра, наследующие с экрана, будут участвовать в жизненном цикле родительского экрана. Однако, похоже, это не так. Например:

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? }
}

Возможно ли, чтобы дочерний экран участвовал в родительском жизненном цикле экрана?

Ответ 1

Похоже, что это поведение не по умолчанию, и родительскому слову должно быть предложено "провести" модели просмотра детей с использованием метода ConductWith, как показано ниже:

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

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

        Child.ConductWith(this);
    }
}

Это гарантирует, что ChildViewModel будет инициализирован, активирован и деактивирован одновременно с родителем. Метод ActivateWith может использоваться, если вам нужно только инициализировать/активировать ребенка.

Ответ 2

Другой вариант - сделать родительский тип Conductor и сделать дочерний элемент активным.

Ответ 3

Другим решением является использование

protected override void OnViewAttached(object view, object context)

вместо OnActivated()