OnInitialize и OnActivate не вызываются в дочерних моделях представления - PullRequest
11 голосов
/ 25 октября 2011

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

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

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

Ответы [ 3 ]

20 голосов
/ 25 октября 2011

Кажется, что это поведение не по умолчанию, и родителю нужно «вести» дочерние модели представления, используя метод ConductWith, следующим образом:

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

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

        Child.ConductWith(this);
    }
}

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

3 голосов
/ 25 октября 2011

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

2 голосов
/ 07 января 2013

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

protected override void OnViewAttached(object view, object context)

вместо OnActivation ()

...